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                    