Java ArrayBlockingQueue

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 mohli java.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.

Zajímavé články...