Método LinkedBlockingQueue drenajeTo() en Java

El método DrainTo(Collection col) de LinkedBlockingQueue elimina todos los elementos disponibles de esta LinkedBlocking Queue y los agrega a la colección dada pasada como parámetro.
 

drenajeA(Colección<? super E> col)

El método DrainTo(Collection<? super E> col) de LinkedBlockingQueue elimina todos los elementos de esta cola y los agrega a la columna de colección dada. Esta es una forma más eficiente que sondear repetidamente esta cola.
También existe la posibilidad de que se produzca un error al intentar agregar elementos a la colección c desde la cola y, debido a ese error, los elementos se distribuyen entre ambas colecciones cuando se lanza la excepción asociada. Si se intenta drenar una cola() para ponerse en cola, se lanzará IllegalArgumentException. Si la colección especificada se modifica mientras la operación está en curso, el comportamiento de esta operación no está definido. Entonces, para usar tales métodos, uno debe cuidar este tipo de situación para superar las excepciones.
Sintaxis:  

public int drainTo(Collection<? super E> col)

Parámetro: este método acepta un parámetro col que representa la colección para transferir elementos de LinkedBlockingQueue.
Valor devuelto: este método devuelve el número de elementos drenados a la colección de la cola.
Excepción: este método arroja las siguientes excepciones:  

  • UnsupportedOperationException : si la colección no puede agregar elementos.
  • ClassCastException : si la clase del elemento detiene el método para agregar el elemento a la colección.
  • NullPointerException : si la colección es nula
  • IllegalArgumentException : si los argumentos del método impiden que se agregue a la colección especificada

Los siguientes programas ilustran el método DrainTo() de la clase LinkedBlockingQueue:
Programa 1: El siguiente
programa tiene un LinkedBlockingQueue que almacena objetos Employee. Hay una ArrayList que almacenará todos los objetos de empleados de LinkedBlockingQueue. Entonces DrainTo() se usa con LinkedBlockingQueue para pasar a todos los empleados de la cola a ArrayList.

Java

// Java Program Demonstrate drainTo(Collection c)
// method of LinkedBlockingQueue.
 
import java.util.ArrayList;
import java.util.concurrent.LinkedBlockingQueue;
 
public class GFG {
 
    // create a Employee Object with
    // position and salary as an attribute
    public class Employee {
 
        public String name;
        public String position;
        public String salary;
        Employee(String name, String position, String salary)
        {
            this.name = name;
            this.position = position;
            this.salary = salary;
        }
        @Override
        public String toString()
        {
            return "Employee [name=" + name + ", position="
                + position + ", salary=" + salary + "]";
        }
    }
 
    // Main Method
    public static void main(String[] args)
    {
        GFG gfg = new GFG();
        gfg.containsMethodExample();
    }
 
    public void containsMethodExample()
    {
 
        // define capacity of LinkedBlockingQueue
        int capacity = 50;
 
        // create object of LinkedBlockingQueue
        LinkedBlockingQueue<Employee> linkedQueue
            = new LinkedBlockingQueue<Employee>(capacity);
 
        // create a ArrayList to pass as parameter to drainTo()
        ArrayList<Employee> collection = new ArrayList<Employee>();
 
        // add Employee object to queue
        Employee emp1 = new Employee("Aman", "Analyst", "24000");
        Employee emp2 = new Employee("Sachin", "Developer", "39000");
        linkedQueue.add(emp1);
        linkedQueue.add(emp2);
 
        // printing Arraylist and queue
        System.out.println("Before drainTo():");
        System.out.println("LinkedBlockingQueue : \n"
                           + linkedQueue.toString());
        System.out.println("ArrayList : \n"
                           + collection);
 
        // Apply drainTo method and pass collection as parameter
        int response = linkedQueue.drainTo(collection);
 
        // print no of element passed
        System.out.println("\nNo of element passed: " + response);
 
        // printing Arraylist and queue after applying drainTo() method
        System.out.println("\nAfter drainTo():");
        System.out.println("LinkedBlockingQueue : \n"
                           + linkedQueue.toString());
        System.out.println("ArrayList : \n"
                           + collection);
    }
}
Producción: 

Before drainTo():
LinkedBlockingQueue : 
[Employee [name=Aman, position=Analyst, salary=24000],
 Employee [name=Sachin, position=Developer, salary=39000]]
ArrayList : 
[]

No of element passed: 2

After drainTo():
LinkedBlockingQueue : 
[]
ArrayList : 
[Employee [name=Aman, position=Analyst, salary=24000], Employee [name=Sachin, position=Developer, salary=39000]]

 

Programa 2: Programa para mostrar la excepción lanzada por el método DrainTo().

Java

// Java Program Demonstrate
// drainTo(Collection C)
// method of LinkedBlockingQueue.
 
import java.util.ArrayList;
import java.util.concurrent.LinkedBlockingQueue;
 
public class GFG {
 
    public static void main(String[] args)
        throws InterruptedException
    {
        // define capacity of LinkedBlockingQueue
        int capacityOfQueue = 4;
 
        // create object of LinkedBlockingQueue
        LinkedBlockingQueue<Integer>
            linkedQueue = new LinkedBlockingQueue<Integer>(capacityOfQueue);
 
        // add elements to queue
        linkedQueue.put(85461);
        linkedQueue.put(44648);
        linkedQueue.put(45654);
 
        // create a collection with null
        ArrayList<Integer> add = null;
 
        // try to drain null queue to collection
        try {
            linkedQueue.drainTo(add);
        }
        catch (Exception e) {
            System.out.println("Exception: " + e);
        }
    }
}
Producción: 

Exception: java.lang.NullPointerException

 

drenajeA(Colección<? super E> col, int maxElements)

El drenajePara(Colección<? super E> col, int maxElements) se utiliza para transferir elementos de números fijos que se pasan como enteros en drenajePara() a la colección que también se pasa como parámetro al método. Después de transferir los elementos, LinkedBlockingQueue tiene solo aquellos elementos que no se transfieren a la colección. Esta función es la misma que la función anterior con algunas limitaciones para transferir un número fijo de elementos.
Sintaxis:  

public int drainTo(Collection<? super E> col, int maxElements)

Parámetro: El método acepta dos parámetros:  

  • col – Representa la colección para transferir elementos desde LinkedBlockingQueue.
  • maxElements : es de tipo entero y se refiere a la cantidad máxima de elementos que se transferirán a la colección.

Valor devuelto: el método devuelve el número de elementos drenados a la colección de la cola.
Excepción: este método arroja las siguientes excepciones:  

  • UnsupportedOperationException : si la colección no puede agregar elementos.
  • ClassCastException: si la clase del elemento detiene el método para agregar el elemento a la colección.
  • NullPointerException : si la colección es nula
  • IllegalArgumentException : si los argumentos del método impiden que se agregue a la colección especificada

Los programas a continuación ilustran el método de drenaje a (Colección <? super E> col, int maxElements) de la clase LinkedBlockingQueue
Programa 1: el
programa a continuación tiene un LinkedBlockingQueue que almacena objetos de empleados y hay un HashSet en el que almacenará todos los objetos de empleados de LinkedBlockingQueue. Por lo tanto, DrainTo() de LinkedBlockingQueue se usa para pasar a algún empleado de la cola a ArrayList. Por lo tanto, ningún elemento que se transferirá se pasa en el método como parámetro.

Java

// Java program  to demonstrate drainTo()
// method of LinkedBlockingQueue.
 
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
 
public class GFG {
 
    // create a Employee Object with
    // position and salary as attribute
    public class Employee {
 
        public String name;
        public String position;
        public String salary;
        Employee(String name, String position, String salary)
        {
            this.name = name;
            this.position = position;
            this.salary = salary;
        }
        @Override
        public String toString()
        {
            return "Employee [name=" + name + ", "
                + "position=" + position + ", salary=" + salary + "]";
        }
    }
 
    // Main Method
    public static void main(String[] args)
    {
        GFG gfg = new GFG();
        gfg.containsMethodExample();
    }
 
    public void containsMethodExample()
    {
 
        // define capacity of LinkedBlockingQueue
        int capacity = 10;
 
        // create object of LinkedBlockingQueue
        LinkedBlockingQueue<Employee> linkedQueue
            = new LinkedBlockingQueue<Employee>(capacity);
 
        // create a HashSet to pass as parameter to drainTo()
        HashSet<Employee> collection = new HashSet<Employee>();
 
        // add Employee object to queue
        Employee emp1 = new Employee("Sachin", "Analyst", "40000");
        Employee emp2 = new Employee("Aman", "Developer", "69000");
        Employee emp3 = new Employee("Kajal", "Accountant", "39000");
        linkedQueue.add(emp1);
        linkedQueue.add(emp2);
        linkedQueue.add(emp3);
 
        // printing Arraylist and queue before applying drainTo() method
        System.out.println("Before drainTo():");
        System.out.println("No of Elements in Queue is " + linkedQueue.size());
        System.out.println("Elements in Queue is as follows");
        Iterator<Employee> listOfemp = linkedQueue.iterator();
        while (listOfemp.hasNext())
            System.out.println(listOfemp.next());
 
        System.out.println("No of Elements in HashSet is " + collection.size());
        System.out.println("Elements in HashSet is as follows:");
        for (Employee emp : collection)
            System.out.println(emp);
 
        // Initialize no of element passed to collection
        // using drainTo() method
        int noOfElement = 2;
 
        // Apply drainTo method and pass collection as parameter
        int response = linkedQueue.drainTo(collection, noOfElement);
 
        // print no of element passed
        System.out.println("\nNo of element passed: " + response);
 
        // printing Arraylist and queue after applying drainTo() method
        System.out.println("\nAfter drainTo():");
        System.out.println("No of Elements in Queue is " + linkedQueue.size());
        System.out.println("Elements in Queue is as follows");
        listOfemp = linkedQueue.iterator();
        while (listOfemp.hasNext())
            System.out.println(listOfemp.next());
 
        System.out.println("No of Elements in HashSet is " + collection.size());
        System.out.println("Elements in HashSet is as follows:");
        for (Employee emp : collection)
            System.out.println(emp);
    }
}
Producción: 

Before drainTo():
No of Elements in Queue is 3
Elements in Queue is as follows
Employee [name=Sachin, position=Analyst, salary=40000]
Employee [name=Aman, position=Developer, salary=69000]
Employee [name=Kajal, position=Accountant, salary=39000]
No of Elements in HashSet is 0
Elements in HashSet is as follows:

No of element passed: 2

After drainTo():
No of Elements in Queue is 1
Elements in Queue is as follows
Employee [name=Kajal, position=Accountant, salary=39000]
No of Elements in HashSet is 2
Elements in HashSet is as follows:
Employee [name=Sachin, position=Analyst, salary=40000]
Employee [name=Aman, position=Developer, salary=69000]

 

Referencia: 

Publicación traducida automáticamente

Artículo escrito por AmanSingh2210 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *