Método BlockingQueue DrainTo() en Java con ejemplos

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);
    }
}
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:

// 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);
        }
    }
}
Producción:

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);
    }
}
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 gopaldave 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 *