Che cos'è Thread-Safe BlockingQueue in Java? Quando dovresti usarlo? In allegato l'attuazione

Pubblicato: 2021-04-30
Cos'è Threadsafe BlockingQueue in Java e quando dovresti usarlo

Finora ho scritto due articoli sul concetto di produttore consumatore su Crunchify. Il primo per spiegare Java Semaphore e Mutex e il secondo per spiegare la lettura/scrittura simultanea.

In questo tutorial Java esamineremo lo stesso concetto di produttore/consumatore per spiegare BlockingQueue in Java .

Quali sono i vantaggi di Blocking Queue in Java?

Un java.util.Queue supporta operazioni che aspettano che la coda diventi non vuota durante il recupero di un elemento e aspettano che lo spazio diventi disponibile nella coda durante la memorizzazione di un elemento.

java.util.BlockingQueue in java - Crunchify

Dobbiamo creare quattro classi Java:

  1. CrunchifyMessage.java per inserire e ricevere messaggi
  2. CrunchifyBlockingProducer.java per mettere il messaggio in coda
  3. CrunchifyBlockingConsumer.java per ottenere il messaggio dalla coda
  4. CrunchifyBlockingMain.java per avviare il test

Le implementazioni di BlockingQueue sono thread-safe . Tutti i metodi di accodamento sono di natura atomica e utilizzano blocchi interni.

Iniziamo con l'implementazione Thread-Safe BlockingQueue in Java

Passo 1

Crea classe CrunchifyMessage.java . Questo è un semplice oggetto Java.

Passo 2

Crea il produttore CrunchifyBlockingProducer.java che ha creato un semplice msg e lo metti in coda.

Passaggio 3

Crea la classe CrunchifyBlockingConsumer.java che consuma il messaggio dalla coda.

Passaggio 4

Crea un semplice metodo CrunchifyBlockingMain.java che esegue il test BlockingQueue. Esegui questo programma per verificare il comportamento di BlockingQueue.

Un BlockingQueue non accetta elementi null . Le implementazioni generano NullPointerException sui tentativi di aggiungere , inserire o offrire un valore null .

Un valore null viene utilizzato come valore sentinella per indicare il fallimento delle operazioni di polling .

Risultato:

Quando dovremmo usare java.util.concurrent.BlockingQueue?

  • Quando vuoi limitare una sorta di richiesta in arrivo, dovresti usare lo stesso
  • Un produttore può anticipare di gran lunga i consumatori con una coda illimitata. Se il consumatore non sta raggiungendo il produttore, potrebbe causare un OutOfMemoryError . In situazioni come queste, potrebbe essere meglio segnalare a un aspirante produttore che la coda è piena e arrendersi rapidamente in caso di errore.
    • In altre parole: i produttori sono naturalmente strozzati.
  • La coda di blocco viene normalmente utilizzata nell'applicazione simultanea
  • Fornisce un'implementazione corretta e thread-safe
  • Anche il consumo di memoria dovrebbe essere limitato