Concurrencia Java - Interfaz BlockingQueue

Una interfaz java.util.concurrent.BlockingQueue es una subinterfaz de la interfaz Queue y, además, admite operaciones como esperar a que la cola no esté vacía antes de recuperar un elemento y esperar a que haya espacio disponible en la cola antes de almacenar un elemento. .

Métodos BlockingQueue

No Señor. Método y descripción
1

boolean add(E e)

Inserta el elemento especificado en esta cola si es posible hacerlo inmediatamente sin violar las restricciones de capacidad, devolviendo verdadero en caso de éxito y lanzando una IllegalStateException si no hay espacio disponible actualmente.

2

boolean contains(Object o)

Devuelve verdadero si esta cola contiene el elemento especificado.

3

int drainTo(Collection<? super E> c)

Elimina todos los elementos disponibles de esta cola y los agrega a la colección dada.

4

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

Elimina como máximo el número dado de elementos disponibles de esta cola y los agrega a la colección dada.

5

boolean offer(E e)

Inserta el elemento especificado en esta cola si es posible hacerlo inmediatamente sin violar las restricciones de capacidad, devolviendo verdadero en caso de éxito y falso si no hay espacio disponible actualmente.

6

boolean offer(E e, long timeout, TimeUnit unit)

Inserta el elemento especificado en esta cola, esperando hasta el tiempo de espera especificado si es necesario para que haya espacio disponible.

7

E poll(long timeout, TimeUnit unit)

Recupera y elimina el encabezado de esta cola, esperando hasta el tiempo de espera especificado si es necesario para que un elemento esté disponible.

8

void put(E e)

Inserta el elemento especificado en esta cola, esperando si es necesario hasta que haya espacio disponible.

9

int remainingCapacity()

Devuelve el número de elementos adicionales que esta cola puede aceptar idealmente (en ausencia de limitaciones de memoria o recursos) sin bloquear, o Integer.MAX_VALUE si no hay un límite intrínseco.

10

boolean remove(Object o)

Elimina una única instancia del elemento especificado de esta cola, si está presente.

11

E take()

Recupera y elimina el encabezado de esta cola, esperando si es necesario hasta que un elemento esté disponible.

Ejemplo

El siguiente programa TestThread muestra el uso de la interfaz BlockingQueue en un entorno basado en subprocesos.

import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class TestThread {

   public static void main(final String[] arguments) throws InterruptedException {
      BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);

      Producer producer = new Producer(queue);
      Consumer consumer = new Consumer(queue);

      new Thread(producer).start();
      new Thread(consumer).start();

      Thread.sleep(4000);
   }  


   static class Producer implements Runnable {
      private BlockingQueue<Integer> queue;

      public Producer(BlockingQueue queue) {
         this.queue = queue;
      }

      @Override
      public void run() {
         Random random = new Random();

         try {
            int result = random.nextInt(100);
            Thread.sleep(1000);
            queue.put(result);
            System.out.println("Added: " + result);
            
            result = random.nextInt(100);
            Thread.sleep(1000);
            queue.put(result);
            System.out.println("Added: " + result);
            
            result = random.nextInt(100);
            Thread.sleep(1000);
            queue.put(result);
            System.out.println("Added: " + result);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }	   
   }

   static class Consumer implements Runnable {
      private BlockingQueue<Integer> queue;

      public Consumer(BlockingQueue queue) {
         this.queue = queue;
      }
      
      @Override
      public void run() {
         
         try {
            System.out.println("Removed: " + queue.take());
            System.out.println("Removed: " + queue.take());
            System.out.println("Removed: " + queue.take());
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }
}

Esto producirá el siguiente resultado.

Salida

Added: 52
Removed: 52
Added: 70
Removed: 70
Added: 27
Removed: 27