Java Language BlockingQueue


Esempio

Un BlockingQueue è un'interfaccia, che è una coda che si blocca quando si tenta di disconnettersi da esso e la coda è vuota, o se si tenta di accodare gli elementi a esso e la coda è già piena. Un thread che tenta di disconnettere da una coda vuota viene bloccato fino a quando un altro thread inserisce un elemento nella coda. Un thread che tenta di accodare un elemento in una coda completa viene bloccato fino a quando un altro thread non fa spazio nella coda, eliminando uno o più elementi o eliminando completamente la coda.

I metodi BlockingQueue sono disponibili in quattro forme, con diversi modi di gestire le operazioni che non possono essere soddisfatti immediatamente, ma potrebbero essere soddisfatti in futuro: uno lancia un'eccezione, il secondo restituisce un valore speciale (nullo o falso, a seconda della operazione), il terzo blocca il thread corrente per un tempo indefinito fino a quando l'operazione può avere successo, e il quarto blocco solo per un dato limite di tempo massimo prima di rinunciare.

operazione Genera l'eccezione Valore speciale blocchi Il tempo è scaduto
Inserire Inserisci() offerta (e) mettere (e) offerta (e, tempo, unità)
Rimuovere rimuovere() sondaggio() prendere() sondaggio (tempo, unità)
Esaminare elemento() sbirciare() N / A N / A

Un BlockingQueue può essere limitato o illimitato . Un BlockingQueue limitato è uno che viene inizializzato con la capacità iniziale.

BlockingQueue<String> bQueue = new ArrayBlockingQueue<String>(2);

Qualsiasi chiamata a un metodo put () verrà bloccata se la dimensione della coda è uguale alla capacità iniziale definita.

Una coda illimitata è una che è inizializzata senza capacità, in realtà per impostazione predefinita è inizializzata con Integer.MAX_VALUE.


Alcune implementazioni comuni di BlockingQueue sono:

  1. ArrayBlockingQueue
  2. LinkedBlockingQueue
  3. PriorityBlockingQueue

Ora diamo un'occhiata a un esempio di ArrayBlockingQueue :

BlockingQueue<String> bQueue = new ArrayBlockingQueue<>(2);
bQueue.put("This is entry 1");
System.out.println("Entry one done");
bQueue.put("This is entry 2");
System.out.println("Entry two done");
bQueue.put("This is entry 3");
System.out.println("Entry three done");

Questo stamperà:

Entry one done
Entry two done

E il thread verrà bloccato dopo la seconda uscita.