V tomto kurzu se pomocí příkladů dozvíme o třídě ArrayBlockingQueue a jejích metodách.
ArrayBlockingQueueTřída rámci Java Kolekce obsahuje implementaci blokování fronty pomocí pole.
Implementuje rozhraní Java BlockingQueue.

Vytváření ArrayBlockingQueue
Abychom mohli vytvořit frontu blokující pole, musíme java.util.concurrent.ArrayBlockingQueuebalíček importovat .
Jakmile naimportujeme balíček, můžeme v Javě vytvořit frontu blokující pole:
ArrayBlockingQueue animal = new ArrayBlockingQueue(int capacity);
Tady,
- Typ - typ fronty blokující pole
- kapacita - velikost fronty blokování pole
Například,
// Creating String type ArrayBlockingQueue with size 5 ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Creating Integer type ArrayBlockingQueue with size 5 ArrayBlockingQueue age = new ArrayBlockingQueue(5);
Poznámka: Je nutné uvést velikost pole.
Metody ArrayBlockingQueue
ArrayBlockingQueueTřída poskytuje realizaci všech metod v BlockingQueuerozhraní.
Tyto metody se používají k vkládání, přístupu a mazání prvků z front blokujících pole.
Také se dozvíme o dvou metod put()a take()této podpory blokování provozu ve frontě blokující pole.
Tyto dvě metody rozlišují frontu blokující pole od jiných typických front.
Vložit prvky
add()- Vloží zadaný prvek do fronty blokování pole. Pokud je fronta plná, vyvolá výjimku.offer()- Vloží zadaný prvek do fronty blokování pole. Vrátí se,falsepokud je fronta plná.
Například,
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); ) )
Výstup
ArrayBlockingQueue: (pes, kočka, kůň)
Přístupové prvky
peek()- Vrátí prvek z přední části fronty blokování pole. Vrátí se,nullpokud je fronta prázdná.iterator()- Vrátí iterátorový objekt pro sekvenční přístup k prvkům z fronty blokování pole. Pokud je fronta prázdná, vyvolá výjimku. Abychom mohlijava.util.Iteratorbalíček použít, musíme jej importovat .
Například,
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(", "); ) ) )
Výstup
ArrayBlockingQueue: (pes, kočka, kůň) Přistupovaný prvek: pes ArrayBlockingQueue prvky: pes, kočka, kůň,
Odebrat prvky
remove()- Vrátí a odebere zadaný prvek z fronty blokování pole. Pokud je fronta prázdná, vyvolá výjimku.poll()- Vrátí a odebere zadaný prvek z fronty blokování pole. Vrátí se,nullpokud je fronta prázdná.clear()- Odebere všechny prvky z fronty blokování pole.
Například,
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); ) )
Výstup
ArrayBlockingQueue: (Pes, Kočka, Kůň) Odebrané prvky: Pomocí remove (): Pes pomocí ankety (): Cat Aktualizováno ArrayBlockingQueue: ()
metoda put () a take ()
V procesech s více vlákny můžeme použít put()a take()blokovat činnost jednoho vlákna k jeho synchronizaci s jiným vláknem. Tyto metody počkají, dokud je nebude možné úspěšně provést.
metoda put ()
Chcete-li přidat prvek na konec fronty blokující pole, můžeme použít put()metodu.
Pokud je fronta blokující pole plná, čeká, dokud ve frontě blokování pole nebude místo pro přidání prvku.
Například,
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); ) ) )
Výstup
ArrayBlockingQueue: (pes, kočka)
Zde může put()metoda hodit, InterruptedExceptionpokud je přerušena během čekání. Proto to musíme uzavřít do bloku pokusu… chytit.
metoda take ()
K vrácení a odebrání prvku z přední části fronty blokování pole můžeme použít take()metodu.
Pokud je fronta blokování pole prázdná, čeká, až budou ve frontě blokování pole odstraněny prvky.
Například,
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); ) ) )
Výstup
ArrayBlockingQueue: (Pes, Kočka) Odstraněný prvek: Pes
Zde take()metoda hodí, InterrupedExceptionpokud je přerušena během čekání. Proto ho musíme uzavřít do try… catchbloku.
Jiné metody
| Metody | Popisy |
|---|---|
contains(element) | Vyhledá ve frontě blokování pole zadaný prvek. Pokud je prvek nalezen, vrátí se true, pokud ne, vrátí se false. |
size() | Vrátí délku fronty blokování pole. |
toArray() | Převede frontu blokující pole na pole a vrátí ji. |
toString() | Převede frontu blokující pole na řetězec |
Proč používat ArrayBlockingQueue?
Jako ArrayBlockingQueuevnitřní úložiště používá pole.
Je považována za kolekci bezpečnou pro vlákna . Proto se obecně používá v aplikacích s více podprocesy.
Předpokládejme, že jedno vlákno vkládá prvky do fronty a jiné vlákno odebírá prvky z fronty.
Nyní, pokud je první vlákno pomalejší než druhé vlákno, může fronta blokující pole způsobit, že druhé vlákno počká, dokud první vlákno nedokončí své operace.








