In questo tutorial impareremo a conoscere l'interfaccia Java BlockingQueue e i suoi metodi.
L' BlockingQueue
interfaccia del Collections
framework Java estende l' Queue
interfaccia. Consente a qualsiasi operazione di attendere fino a quando non può essere eseguita con successo.
Ad esempio, se si desidera eliminare un elemento da una coda vuota, la coda di blocco consente all'operazione di eliminazione di attendere fino a quando la coda contiene alcuni elementi da eliminare.
Classi che implementano BlockingQueue
Poiché BlockingQueue
è un'interfaccia, non possiamo fornirne l'implementazione diretta.
Per poter utilizzare la funzionalità di BlockingQueue
, dobbiamo utilizzare classi che la implementino.
- ArrayBlockingQueue
- LinkedBlockingQueue
Come utilizzare le code di blocco?
Dobbiamo importare il java.util.concurrent.BlockingQueue
pacchetto per poter utilizzare BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Qui abbiamo creato gli oggetti animal1 e animal2 di classi ArrayBlockingQueue
e LinkedBlockingQueue
, rispettivamente. Questi oggetti possono utilizzare le funzionalità BlockingQueue
dell'interfaccia.
Metodi di BlockingQueue
A seconda che una coda sia piena o vuota, i metodi di una coda di blocco possono essere suddivisi in 3 categorie:
Metodi che generano un'eccezione
add()
- Inserisce un elemento nella coda di blocco alla fine della coda. Genera un'eccezione se la coda è piena.element()
- Restituisce il capo della coda di blocco. Genera un'eccezione se la coda è vuota.remove()
- Rimuove un elemento dalla coda di blocco. Genera un'eccezione se la coda è vuota.
Metodi che restituiscono un valore
offer()
- Inserisce l'elemento specificato nella coda di blocco alla fine della coda. Restituiscefalse
se la coda è piena.peek()
- Restituisce il capo della coda di blocco. Restituiscenull
se la coda è vuota.poll()
- Rimuove un elemento dalla coda di blocco. Restituiscenull
se la coda è vuota.
Altro in offerta () e sondaggio ()
Il metodo offer()
e poll()
può essere utilizzato con i timeout. Cioè, possiamo passare le unità di tempo come parametro. Per esempio,
offer(value, 100, milliseconds)
Qui,
- valore è l'elemento da inserire nella coda
- E abbiamo impostato un timeout di 100 millisecondi
Ciò significa che il offer()
metodo tenterà di inserire un elemento nella coda di blocco per 100
millisecondi. Se l'elemento non può essere inserito in 100 millisecondi, il metodo restituisce false
.
Nota: Al posto di milliseconds
, possiamo anche usare queste unità di tempo: days
, hours
, minutes
, seconds
, microseconds
e nanoseconds
in offer()
e poll()
metodi.
Metodi che bloccano l'operazione
Il BlockingQueue
fornisce inoltre metodi per bloccare le operazioni e attendere se la coda è piena o vuota.
put()
- Inserisce un elemento nella coda di blocco. Se la coda è piena, attenderà finché la coda non avrà spazio per inserire un elemento.take()
- Rimuove e restituisce un elemento dalla coda di blocco. Se la coda è vuota, attenderà finché la coda non avrà elementi da eliminare.
Supponiamo di voler inserire elementi in una coda. Se la coda è piena, il put()
metodo attenderà fino a quando la coda non avrà spazio per inserire gli elementi.
Allo stesso modo, se vogliamo eliminare elementi da una coda. Se la coda è vuota, il take()
metodo attenderà fino a quando la coda non contiene elementi da eliminare.
Implementazione di BlockingQueue in ArrayBlockingQueue
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Produzione
BlockingQueue: (2, 1, 3) Elemento rimosso: 2
Per saperne di più ArrayBlockingQueue
, visita Java ArrayBlockingQueue.
Perché BlockingQueue?
In Java, BlockingQueue
è considerata la raccolta thread-safe . È perché può essere utile nelle operazioni multi-threading.
Supponiamo che un thread inserisca elementi nella coda e un altro thread rimuova elementi dalla coda.
Ora, se il primo thread viene eseguito più lentamente, la coda di blocco può far attendere il secondo thread fino a quando il primo thread non completa la sua operazione.