Concorrenza Java - Interfaccia BlockingQueue

Un'interfaccia java.util.concurrent.BlockingQueue è una sottointerfaccia dell'interfaccia Queue e supporta inoltre operazioni come l'attesa che la coda diventi non vuota prima di recuperare un elemento e attendere che lo spazio diventi disponibile nella coda prima di memorizzare un elemento .

Metodi BlockingQueue

Sr.No. Metodo e descrizione
1

boolean add(E e)

Inserisce l'elemento specificato in questa coda se è possibile farlo immediatamente senza violare le limitazioni di capacità, restituendo true in caso di esito positivo e generando un'eccezione IllegalStateException se non è attualmente disponibile spazio.

2

boolean contains(Object o)

Restituisce vero se questa coda contiene l'elemento specificato.

3

int drainTo(Collection<? super E> c)

Rimuove tutti gli elementi disponibili da questa coda e li aggiunge alla raccolta data.

4

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

Rimuove al massimo il numero dato di elementi disponibili da questa coda e li aggiunge alla raccolta data.

5

boolean offer(E e)

Inserisce l'elemento specificato in questa coda se è possibile farlo immediatamente senza violare le limitazioni di capacità, restituendo true in caso di successo e false se non è attualmente disponibile spazio.

6

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

Inserisce l'elemento specificato in questa coda, attendendo fino al tempo di attesa specificato, se necessario, affinché lo spazio diventi disponibile.

7

E poll(long timeout, TimeUnit unit)

Recupera e rimuove la testata di questa coda, aspettando fino al tempo di attesa specificato, se necessario, che un elemento diventi disponibile.

8

void put(E e)

Inserisce l'elemento specificato in questa coda, aspettando se necessario che lo spazio diventi disponibile.

9

int remainingCapacity()

Restituisce il numero di elementi aggiuntivi che questa coda può idealmente (in assenza di vincoli di memoria o di risorse) accettare senza bloccare, o Integer.MAX_VALUE se non c'è limite intrinseco.

10

boolean remove(Object o)

Rimuove una singola istanza dell'elemento specificato da questa coda, se presente.

11

E take()

Recupera e rimuove la testa di questa coda, aspettando se necessario fino a quando un elemento non diventa disponibile.

Esempio

Il seguente programma TestThread mostra l'utilizzo dell'interfaccia BlockingQueue in un ambiente basato su thread.

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

Questo produrrà il seguente risultato.

Produzione

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