El método DrainTo(Collection col) de BlockingQueue elimina todos los elementos disponibles de esta LinkedBlocking Queue y los agrega a la colección dada pasada como parámetro.
Nota : el método DrainTo() de BlockingQueue se ha heredado de la clase Queue en Java.
drenajeA(Colección<? super E> col)
El método DrainTo(Collection<? super E> col) de la interfaz BlockingQueue 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 BlockingQueue:
Programa 1:
// Java Program Demonstrate drainTo(Collection c) // method of BlockingQueue. import java.util.ArrayList; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.BlockingQueue; 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 BlockingQueue int capacity = 50; // create object of BlockingQueue BlockingQueue<Employee> BQ = 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"); BQ.add(emp1); BQ.add(emp2); // printing Arraylist and queue System.out.println("Before drainTo():"); System.out.println("BlockingQueue : \n" + BQ.toString()); System.out.println("ArrayList : \n" + collection); // Apply drainTo method and pass collection as parameter int response = BQ.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("BlockingQueue : \n" + BQ.toString()); System.out.println("ArrayList : \n" + collection); } }
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:
// Java Program Demonstrate // drainTo(Collection C) // method of BlockingQueue. import java.util.ArrayList; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.BlockingQueue; public class GFG { public static void main(String[] args) throws InterruptedException { // define capacity of BlockingQueue int capacityOfQueue = 4; // create object of BlockingQueue BlockingQueue<Integer> BQ = new LinkedBlockingQueue<Integer>(capacityOfQueue); // add elements to queue BQ.put(85461); BQ.put(44648); BQ.put(45654); // create a collection with null ArrayList<Integer> add = null; // try to drain null queue to collection try { BQ.drainTo(add); } catch (Exception e) { System.out.println("Exception: " + e); } } }
Exception: java.lang.NullPointerException
drenajeA(Colección<? super E> col, int maxElements)
El drenajePara(Colección<? super E> col, int maxElements) se usa 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, BlockingQueue solo tiene 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 BlockingQueue.
- 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 siguientes programas ilustran el método de drenaje a (Colección <? super E> col, int maxElements) de la clase BlockingQueue
Programa 1:
El programa a continuación tiene un BlockingQueue que almacena objetos de empleados y hay un HashSet en el que almacenará todos los objetos de empleados de BlockingQueue. Por lo tanto, DrainTo() de BlockingQueue 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 program to demonstrate drainTo() // method of BlockingQueue. import java.util.*; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.BlockingQueue; 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 BlockingQueue int capacity = 10; // create object of BlockingQueue BlockingQueue<Employee> BQ = 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"); BQ.add(emp1); BQ.add(emp2); BQ.add(emp3); // printing Arraylist and queue before applying drainTo() method System.out.println("Before drainTo():"); System.out.println("No of Elements in Queue is " + BQ.size()); System.out.println("Elements in Queue is as follows"); Iterator<Employee> listOfemp = BQ.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 = BQ.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 " + BQ.size()); System.out.println("Elements in Queue is as follows"); listOfemp = BQ.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); } }
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: