English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
Poiché BlockingQueue è un'interfaccia, non possiamo fornire la sua implementazione diretta.
Per utilizzare le funzionalità di BlockingQueue, dobbiamo utilizzare le classi che l'eseguono.
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.
In base a se la coda è piena o vuota, i metodi della coda bloccata possono essere divisi in 3 categorie:
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.
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.
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.
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.
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.