English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introduzione di Base Java

Java Controllo dei Flussi

Java Array

Java Orientazione ad Oggetti (I)

Java Orientazione ad Oggetti (II)

Java Orientazione ad Oggetti (III)

Gestione delle Eccezioni Java

Java List

Java Queue (Coda)

Java Map Collection

Java Set Collection

Java Input/Output (I/O)

Java Reader/Writer

Altri argomenti Java

Java BlockingQueue

In questa guida, impareremo l'interfaccia Java BlockingQueue e i suoi metodi.

L'interfaccia BlockingQueue del framework Java Collections espande l'interfaccia Queue. Permette qualsiasi operazione di aspettare fino a che venga eseguita con successo.

Ad esempio, se dobbiamo rimuovere un elemento da una coda vuota, la coda bloccata permette all'operazione di rimozione di aspettare fino a quando la coda contiene alcuni elementi da rimuovere.

Classi che implementano BlockingQueue

Poiché BlockingQueue è un'interfaccia, non possiamo fornire la sua implementazione diretta.

Per utilizzare le funzionalità di BlockingQueue, dobbiamo utilizzare le classi che l'eseguono.

Come utilizzare la coda bloccata?

Dobbiamo importare il pacchetto java.util.concurrent.BlockingQueue per utilizzare BlockingQueue.

//Implementazione Array di BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
//Implementazione LinkedList di BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();

In questo caso, abbiamo creato gli oggetti animal1 e animal2 delle classi ArrayBlockingQueue e LinkedBlockingQueue. Questi oggetti possono utilizzare le funzionalità dell'interfaccia BlockingQueue.

Metodi di BlockingQueue

In base a se la coda è piena o vuota, i metodi della coda bloccata possono essere divisi in 3 categorie:

Metodi che lanciano eccezioni

  • add() - Inserisce l'elemento alla fine della coda bloccata. Se la coda è piena, lancia un'eccezione.

  • element() - Restituisce l'elemento in testa alla coda bloccata. Se la coda è vuota, lancia un'eccezione.

  • remove() - Rimuove un elemento dalla coda bloccata. Se la coda è vuota, lancia un'eccezione.

Metodi per restituire un valore

  • offer() - Inserisce l'elemento specificato alla fine della coda bloccata. Se la coda è piena, restituisce false.

  • peek() - Restituisce l'elemento in testa alla coda bloccata. Se la coda è vuota, restituisce null.

  • poll() - Rimuove un elemento dalla coda bloccata. Se la coda è vuota, restituisce null.

offer() e poll()Più contenuti

Le metodi offer() e poll() possono essere utilizzati con timeout. Questo significa che possiamo passare l'unità di tempo come parametro. Ad esempio,

offer(value, 100, milliseconds)}

Ecco:

  • value è l'elemento da inserire nella coda

  • E impostiamo il timeout a 100 millisecondi

Questo significa che il metodo offer() tenta di inserire un elemento nella coda bloccante per 100 millisecondi. Se non è possibile inserire l'elemento entro 100 millisecondi, il metodo restituisce false.

Nota:Oltre ai millisecondi, possiamo usare i seguenti unità di tempo nei metodi offer() e poll(): giorni, ore, minuti, secondi, microsecondi e nanosecondi.

Metodi di operazione di BlockingQueue

BlockingQueue fornisce anche alcuni metodi per bloccare le operazioni e aspettare, se la coda è piena o vuota.

  • put() - Inserisce un elemento nella coda bloccante. Se la coda è piena, attende fino a quando la coda ha spazio per inserire l'elemento.

  • take() - Rimuove e restituisce un elemento dalla coda bloccante. Se la coda è vuota, attende fino a quando la coda contiene l'elemento da rimuovere.

Supponiamo che vogliamo inserire un elemento nella coda. Se la coda è piena, il metodo put() attende fino a quando la coda ha spazio per inserire l'elemento.

Allo stesso modo, se vogliamo rimuovere un elemento dalla coda. Se la coda è vuota, il metodo take() attende fino a quando la coda contiene l'elemento da rimuovere.

Implementazione di BlockingQueue in ArrayBlockingQueue

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
class Main {
    public static void main(String[] args) {
      //Crea una coda bloccante utilizzando ArrayBlockingQueue
      BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
      try {
        //Inserisce un elemento nella coda bloccante
        numbers.put(2);
        numbers.put(1);
        numbers.put(3);
        System.out.println("BLockingQueue: " + numbers);
        //Rimuove un elemento dalla coda bloccante
        int removedNumber = numbers.take();
        System.out.println("Numero rimosso: " + removedNumber);
      }
      catch(Exception e) {
          e.getStackTrace();
      }
    }
}

Risultato di output

BlockingQueue: [2, 1, 3]
Elemento rimosso: 2

Per ulteriori informazioni su ArrayBlockingQueue, visitareJava ArrayBlockingQueue.

Perché scegliere BlockingQueue?

In Java, BlockingQueue viene consideratoThread-safeColeczione. Questo perché potrebbe aiutare nelle operazioni multithreading.

Supponiamo che un thread stia inserendo elementi nella coda mentre un altro thread sta rimuovendo elementi dalla coda.

Ora, se il primo thread esegue lentamente, la coda bloccata può far aspettare il secondo thread fino a quando il primo thread ha completato l'operazione.