V tomto kurzu se pomocí příkladů dozvíme o třídě ArrayBlockingQueue a jejích metodách.
ArrayBlockingQueue
Tří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.ArrayBlockingQueue
balíč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
ArrayBlockingQueue
Třída poskytuje realizaci všech metod v BlockingQueue
rozhraní.
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,false
pokud 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,null
pokud 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.Iterator
balíč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,null
pokud 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, InterruptedException
pokud 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í, InterrupedException
pokud je přerušena během čekání. Proto ho musíme uzavřít do try… catch
bloku.
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 ArrayBlockingQueue
vnitř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.