Java LinkedBlockingQueue

In questo tutorial, impareremo a conoscere la classe LinkedBLockingQueue e i suoi metodi con l'aiuto di esempi.

La LinkedBlockingQueueclasse del Collectionsframework Java fornisce l'implementazione della coda di blocco utilizzando un elenco collegato.

Implementa l'interfaccia Java BlockingQueue.

Creazione di LinkedBlockingQueue

Per creare una coda di blocco collegata, dobbiamo importare il java.util.concurrent.LinkedBlockingQueuepacchetto.

Ecco come possiamo creare una coda di blocco collegata in Java:

1. Senza la capacità iniziale

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Qui la capacità iniziale predefinito sarà 2 31 -1.

2. Con la capacità iniziale

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Qui,

  • Tipo: il tipo di coda di blocco collegata
  • capacità: la dimensione della coda di blocco collegata

Per esempio,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Nota: non è obbligatorio fornire la dimensione dell'elenco collegato.

Metodi di LinkedBlockingQueue

La LinkedBlockingQueueclasse fornisce l'implementazione di tutti i metodi nell'interfaccia BlockingQueue.

Questi metodi vengono utilizzati per inserire, accedere ed eliminare elementi dalle code di blocco collegate.

Inoltre, impareremo due metodi put()e take()che supportano l'operazione di blocco nella coda di blocco collegata.

Questi due metodi distinguono la coda di blocco collegata da altre code tipiche.

Inserisci elementi

  • add()- Inserisce un elemento specificato nella coda di blocco collegata. Genera un'eccezione se la coda è piena.
  • offer()- Inserisce un elemento specificato nella coda di blocco collegata. Ritorna falsese la coda è piena.

Per esempio,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Produzione

 LinkedBlockingQueue: (Cane, Gatto, Cavallo) 

Elementi di accesso

  • peek()- Restituisce un elemento dalla parte anteriore della coda di blocco collegata. Ritorna nullse la coda è vuota.
  • iterator()- Restituisce un oggetto iteratore per accedere in modo sequenziale a un elemento dalla coda di blocco collegata. Genera un'eccezione se la coda è vuota. Dobbiamo importare il java.util.Iteratorpacchetto per usarlo.

Per esempio,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Produzione

 LinkedBlockingQueue: (Dog, Cat, Horse) Elemento a cui si accede: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse, 

Rimuovi elementi

  • remove()- Restituisce e rimuove un elemento specificato dalla coda di blocco collegata. Genera un'eccezione se la coda è vuota.
  • poll()- Restituisce e rimuove un elemento specificato dalla coda di blocco collegata. Ritorna nullse la coda è vuota.
  • clear() - Rimuove tutti gli elementi dalla coda di blocco collegata.

Per esempio,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated LinkedBlockingQueue " + animals); ) ) 

Produzione

 LinkedBlockingQueue: (Dog, Cat, Horse) Elementi rimossi: Using remove (): Dog Using poll (): Cat Aggiornato LinkedBlockingQueue: () 

metodi put () e take ()

Nei processi multithread, possiamo usare put()e take()per bloccare il funzionamento di un thread per sincronizzarlo con un altro thread. Questi metodi aspetteranno fino a quando non potranno essere eseguiti con successo.

metodo put ()

Per inserire l'elemento specificato alla fine di una coda di blocco collegata, usiamo il put()metodo.

Se la coda di blocco collegata è piena, attende finché non c'è spazio nella coda di blocco collegata per inserire l'elemento.

Per esempio,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Produzione

 LinkedBlockingQueue: (Cane, Gatto) 

In questo caso, il put()metodo può generare un messaggio InterruptedExceptionse viene interrotto durante l'attesa. Quindi, dobbiamo racchiuderlo all'interno di un blocco try… catch.

metodo take ()

Per restituire e rimuovere un elemento dalla parte anteriore della coda di blocco collegata, possiamo utilizzare il take()metodo.

Se la coda di blocco collegata è vuota, attende finché non sono presenti elementi da eliminare nella coda di blocco collegata.

Per esempio,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Produzione

 LinkedBlockingQueue: (Dog, Cat) Rimosso Elemento: Dog New LinkedBlockingQueue: (Cat) 

Qui, il take()metodo lancerà un InterrupedExceptionse viene interrotto durante l'attesa. Quindi, dobbiamo racchiuderlo all'interno di un try… catchblocco.

Altri metodi

Metodi Descrizioni
contains(element) Cerca l'elemento specificato nella coda di blocco collegata. Se l'elemento viene trovato, ritorna true, altrimenti ritorna false.
size() Restituisce la lunghezza della coda di blocco collegata.
toArray() Converte la coda di blocco collegata in un array e restituisce l'array.
toString() Converte la coda di blocco collegata in una stringa

Perché utilizzare LinkedBlockingQueue?

Gli LinkedBlockingQueueusi collegati liste come la sua memoria interna.

È considerata una raccolta thread-safe . Quindi, è generalmente utilizzato nelle applicazioni multi-threading.

Supponiamo che un thread inserisca elementi nella coda e un altro thread rimuova elementi dalla coda.

Ora, se il primo thread è più lento del secondo thread, la coda di blocco collegata può fare in modo che il secondo thread attenda finché il primo thread non completa le sue operazioni.

Articoli interessanti...