In questo tutorial, impareremo a conoscere la classe ArrayBlockingQueue e i suoi metodi con l'aiuto di esempi.
La ArrayBlockingQueue
classe del framework Java Collections fornisce l'implementazione della coda di blocco utilizzando un array.
Implementa l'interfaccia Java BlockingQueue.
Creazione di ArrayBlockingQueue
Per creare una coda di blocco degli array, dobbiamo importare il java.util.concurrent.ArrayBlockingQueue
pacchetto.
Una volta importato il pacchetto, ecco come possiamo creare una coda di blocco degli array in Java:
ArrayBlockingQueue animal = new ArrayBlockingQueue(int capacity);
Qui,
- Tipo: il tipo di coda che blocca l'array
- capacità: la dimensione della coda di blocco dell'array
Per esempio,
// Creating String type ArrayBlockingQueue with size 5 ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Creating Integer type ArrayBlockingQueue with size 5 ArrayBlockingQueue age = new ArrayBlockingQueue(5);
Nota: è obbligatorio fornire la dimensione dell'array.
Metodi di ArrayBlockingQueue
La ArrayBlockingQueue
classe fornisce l'implementazione di tutti i metodi BlockingQueue
nell'interfaccia.
Questi metodi vengono utilizzati per inserire, accedere ed eliminare elementi dalle code di blocco degli array.
Inoltre, impareremo due metodi put()
e take()
che supportano l'operazione di blocco nella coda di blocco dell'array.
Questi due metodi distinguono la coda di blocco dell'array da altre code tipiche.
Inserisci elementi
add()
- Inserisce l'elemento specificato nella coda di blocco dell'array. Genera un'eccezione se la coda è piena.offer()
- Inserisce l'elemento specificato nella coda di blocco dell'array. Ritornafalse
se la coda è piena.
Per esempio,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("ArrayBlockingQueue: " + animals); ) )
Produzione
ArrayBlockingQueue: (Cane, Gatto, Cavallo)
Elementi di accesso
peek()
- Restituisce un elemento dalla parte anteriore della coda di blocco dell'array. Ritornanull
se la coda è vuota.iterator()
- Restituisce un oggetto iteratore per accedere in modo sequenziale agli elementi dalla coda di blocco dell'array. Genera un'eccezione se la coda è vuota. Dobbiamo importare iljava.util.Iterator
pacchetto per usarlo.
Per esempio,
import java.util.concurrent.ArrayBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("ArrayBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) )
Produzione
ArrayBlockingQueue: (Dog, Cat, Horse) Elemento a cui si accede: Dog ArrayBlockingQueue Elements: Dog, Cat, Horse,
Rimuovi elementi
remove()
- Restituisce e rimuove un elemento specificato dalla coda di blocco dell'array. Genera un'eccezione se la coda è vuota.poll()
- Restituisce e rimuove un elemento specificato dalla coda di blocco dell'array. Ritornanull
se la coda è vuota.clear()
- Rimuove tutti gli elementi dalla coda di blocco dell'array.
Per esempio,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + 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 ArrayBlockingQueue: " + animals); ) )
Produzione
ArrayBlockingQueue: (Dog, Cat, Horse) Elementi rimossi: Using remove (): Dog Using poll (): Cat Aggiornato ArrayBlockingQueue: ()
metodo 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 aggiungere un elemento alla fine di una coda di blocco di array, possiamo utilizzare il put()
metodo.
Se la coda di blocco dell'array è piena, attende finché non c'è spazio nella coda di blocco dell'array per aggiungere un elemento.
Per esempio,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) )
Produzione
ArrayBlockingQueue: (Cane, Gatto)
In questo caso, il put()
metodo può generare un messaggio InterruptedException
se 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 dell'array, possiamo utilizzare il take()
metodo.
Se la coda di blocco dell'array è vuota, attende finché non sono presenti elementi nella coda di blocco dell'array da eliminare.
Per esempio,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); ) catch(Exception e) ( System.out.println(e); ) ) )
Produzione
ArrayBlockingQueue: (Dog, Cat) Elemento rimosso: Dog
Qui, il take()
metodo lancerà un InterrupedException
se viene interrotto durante l'attesa. Quindi, dobbiamo racchiuderlo all'interno di un try… catch
blocco.
Altri metodi
Metodi | Descrizioni |
---|---|
contains(element) | Cerca l'elemento specificato nella coda di blocco dell'array. Se l'elemento viene trovato, ritorna true , altrimenti ritorna false . |
size() | Restituisce la lunghezza della coda di blocco dell'array. |
toArray() | Converte la coda di blocco dell'array in un array e lo restituisce. |
toString() | Converte la coda di blocco dell'array in una stringa |
Perché utilizzare ArrayBlockingQueue?
Gli ArrayBlockingQueue
usi array come 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 dell'array può fare in modo che il secondo thread attenda fino a quando il primo thread non completa le sue operazioni.