English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, esploreremo l'uso della classe LinkedBLockingQueue e dei suoi metodi con l'aiuto di esempi.
La classe LinkedBlockingQueue del framework Java Collections utilizza una coda bloccata fornita da una lista.
Ha implementatoInterfaccia BlockingQueue Java.
Per creare una coda bloccata a elenco, dobbiamo importare il pacchetto java.util.concurrent.LinkedBlockingQueue.
Ecco come creiamo una coda bloccata a elenco in Java:
1. Senza capacità iniziale
LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();
In questo caso, la capacità iniziale predefinita è 2 31 -1.
2. Con capacità iniziale
LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>(int capacity);
Ecco
Type - Tipo della coda bloccata a elenco
capacity - Dimensione della coda bloccata a elenco
Ad esempio,
//Creazione di LinkedBlockingQueue di stringhe di dimensione 5 LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); //Creazione di LinkedBlockingQueue di interi di dimensione 5 LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>(5);
Attenzione:Non è necessario fornire la dimensione della coda.
La classe LinkedBlockingQueue fornisceInterfaccia di BlockingQueueImplementazione di tutti i metodi.
Questi metodi servono a inserire, accedere e rimuovere elementi dalla coda bloccata a elenco.
Inoltre, impareremo due metodi put(), take(), che supportano operazioni bloccate nella coda bloccata a elenco.
Questi metodi distinguono la coda bloccata a elenco da altre code tipiche.
add() - Inserisce l'elemento specificato nella coda bloccata a elenco. Se la coda è piena, lancia un'eccezione.
offer() - Inserisce l'elemento specificato nella coda bloccata a elenco. Se la coda è piena, restituisce false.
Ad esempio,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); // 使用 add() animals.add("Dog"); animals.add("Cat"); // 使用 offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); } }
Risultato dell'output
LinkedBlockingQueue: [Dog, Cat, Horse]
peek() - Restituisce un elemento dalla testa della coda bloccata a elenco. Se la coda è vuota, restituisce null.
iterator() - Restituisce un oggetto iteratore per accedere in ordine agli elementi della coda bloccata a elenco. Se la coda è vuota, viene lanciata un'eccezione. Dobbiamo importare il pacchetto java.util.Iterator per utilizzarlo.
Ad esempio,
import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); //添加元素 animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // 使用 peek() String element = animals.peek(); System.out.println("Accedi all'elemento: " + element); // Utilizza iterator() Iterator<String> iterate = animals.iterator(); System.out.print("Elementi della LinkedBlockingQueue "); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Risultato dell'output
LinkedBlockingQueue: [Dog, Cat, Horse] Accedi all'elemento: Dog Elementi della LinkedBlockingQueue: Dog, Cat, Horse,
remove() - Restituisce e elimina l'elemento specificato dalla coda bloccata a lista. Se la coda è vuota, lancia un'eccezione.
poll() - Restituisce e elimina l'elemento specificato dalla coda bloccata a lista. Se la coda è vuota, restituisce null.
clear() - Elimina tutti gli elementi dalla coda bloccata a lista.
Ad esempio,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // 使用 remove() String element1 = animals.remove(); System.out.println("删除元素:"); System.out.println("使用 remove(): " + element1); // 使用 poll() String element2 = animals.poll(); System.out.println("使用 poll(): " + element2); // 使用 clear() animals.clear(); System.out.println("更新后的LinkedBlockingQueue " + animals); } }
Risultato dell'output
LinkedBlockingQueue: [Dog, Cat, Horse] 删除元素: 使用 remove(): Dog 使用 poll(): Cat 更新后的LinkedBlockingQueue: []
Nel processo multithreading, possiamo utilizzare put() e take() per bloccare l'operazione di una thread per sincronizzarla con un altro thread. Questi metodi attendono fino a quando non possono essere eseguiti con successo.
Per inserire l'elemento specificato alla fine della coda bloccata della lista, utilizziamo il metodo put().
Se la coda bloccata della lista è piena, attende fino a quando la coda bloccata della lista ha abbastanza spazio per inserire l'elemento.
Ad esempio,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); try { //Aggiunta di elementi a animals animals.put("Cane"); animals.put("Gatto"); System.out.println("LinkedBlockingQueue: " + animals); } catch(Exception e) { System.out.println(e); } } }
Risultato dell'output
LinkedBlockingQueue: [Cane, Gatto]
In questo caso, se interrotto durante l'attesa, il metodo put() potrebbe sollevare un'InterrupedException. Pertanto, dobbiamo includerlo inNel blocco try..catch.
Per restituire e eliminare un elemento dalla coda bloccata della lista, possiamo utilizzare il metodo take().
Se la coda bloccata della lista è vuota, attende fino a quando la coda bloccata della lista ha l'elemento da eliminare.
Ad esempio,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); try { //Aggiunta di elementi a animals animals.put("Cane"); animals.put("Gatto"); System.out.println("LinkedBlockingQueue: " + animals); //Eliminazione di un elemento String element = animals.take(); System.out.println("Eliminazione dell'elemento: " + element); System.out.println("Nuova LinkedBlockingQueue: " + animals); } catch(Exception e) { System.out.println(e); } } }
Risultato dell'output
LinkedBlockingQueue: [Cane, Gatto] Eliminazione dell'elemento: [Cane] Nuova LinkedBlockingQueue: [Gatto]
In questo caso, se interrotto durante l'attesa, il metodo take() solleverà un'InterrupedException. Pertanto, dobbiamo chiuderlo in un blocco try...catch.
Metodo | Descrizione del contenuto |
---|---|
contains(element) | Cercare l'elemento specificato nella coda bloccata di lista. Se trovato, restituire true, altrimenti restituire false. |
size() | Restituire la lunghezza della coda bloccata di lista. |
toArray() | Convertire la coda bloccata di lista in un array e restituire quell'array. |
toString() | Convertire la coda bloccata di lista in una stringa |
LinkedBlockingQueue utilizza una lista come suo archivio interno.
Si consideraThread-safeSet. Pertanto, viene utilizzato spesso nelle applicazioni multithreading.
Supponiamo che un thread stia inserendo un elemento nella coda e un altro thread stia rimuovendo un elemento dalla coda.
Ora, se il primo thread è più lento del secondo thread, la coda bloccata di lista può far attendere il secondo thread fino a quando il primo thread ha completato la sua operazione.