V tomto tutoriáli sa pomocou príkladov dozvieme o triede ArrayBlockingQueue a jej metódach.
ArrayBlockingQueue
Trieda rámci Java Kolekcia obsahuje implementáciu blokovanie fronty pomocou poľa.
Implementuje rozhranie Java BlockingQueue.
Vytvára sa ArrayBlockingQueue
Ak chcete vytvoriť front blokujúcich pole, musíme java.util.concurrent.ArrayBlockingQueue
balíček importovať .
Po importovaní balíka môžeme vytvoriť postup blokovania polí v Jave takto:
ArrayBlockingQueue animal = new ArrayBlockingQueue(int capacity);
Tu,
- Typ - typ frontu blokovania polí
- kapacita - veľkosť frontu na blokovanie poľa
Naprí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 potrebné uviesť veľkosť poľa.
Metódy ArrayBlockingQueue
ArrayBlockingQueue
Trieda poskytuje realizáciu všetkých metód v BlockingQueue
rozhraní.
Tieto metódy sa používajú na vkladanie, prístup a mazanie prvkov z frontov blokujúcich pole.
Tiež sa dozvieme o dvoch metód put()
a take()
tejto podpory blokovanie premávky vo fronte blokujúce poľa.
Tieto dve metódy rozlišujú front blokujúcich pole od iných typických frontov.
Vložiť prvky
add()
- Vloží zadaný prvok do frontu blokovania poľa. Ak je fronta plná, vyvolá výnimku.offer()
- Vloží zadaný prvok do frontu blokovania poľa. Vráti sa,false
ak je rad plný.
Naprí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ýkon
ArrayBlockingQueue: (pes, mačka, kôň)
Prístupové prvky
peek()
- Vráti prvok z prednej strany frontu blokovania poľa. Vráti sa,null
ak je rad prázdny.iterator()
- Vráti objekt iterátora na postupný prístup k prvkom z frontu blokovania poľa. Ak je rad prázdny, vyvolá výnimku. Aby sme mohlijava.util.Iterator
balík použiť, musíme ho importovať .
Naprí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ýkon
ArrayBlockingQueue: (Pes, Mačka, Kôň) Pristupovaný prvok: Pes Prvky ArrayBlockingQueue: Pes, Mačka, Kôň,
Odstrániť prvky
remove()
- Vráti a odstráni zadaný prvok z frontu blokovania poľa. Ak je rad prázdny, hodí výnimku.poll()
- Vráti a odstráni zadaný prvok z frontu blokovania poľa. Vráti sa,null
ak je rad prázdny.clear()
- Odstráni všetky prvky z frontu blokovania poľa.
Naprí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ýkon
ArrayBlockingQueue: (Pes, Mačka, Kôň) Odstránené prvky: Pomocou remove (): Pes pomocou ankety (): Cat Aktualizované ArrayBlockingQueue: ()
put () a take () metóda
V procesoch viacerých vlákien môžeme pomocou put()
a take()
blokovať činnosť jedného vlákna, aby sme ho synchronizovali s iným vláknom. Tieto metódy počkajú, kým sa dajú úspešne vykonať.
metóda put ()
Na pridanie prvku na koniec frontu na blokovanie poľa môžeme použiť put()
metódu.
Ak je rad blokovania polí plný, čaká na pridanie prvku do frontu blokovania poľa.
Naprí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ýkon
ArrayBlockingQueue: (pes, mačka)
Tu môže put()
metóda hodiť, InterruptedException
ak je prerušená počas čakania. Preto ho musíme uzavrieť do bloku pokusu … chytiť.
metóda take ()
Na vrátenie a odstránenie prvku z prednej strany frontu na blokovanie poľa môžeme použiť take()
metódu.
Ak je rad blokovania polí prázdny, čaká sa na odstránenie prvkov vo fronte blokovania polí.
Naprí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ýkon
ArrayBlockingQueue: (Pes, Mačka) Odstránený prvok: Pes
Tu take()
metóda hodí InterrupedException
ak je prerušená počas čakania. Preto ho musíme uzavrieť do try… catch
bloku.
Iné metódy
Metódy | Popisy |
---|---|
contains(element) | Vyhľadá v rade na blokovanie poľa zadaný prvok. Ak sa prvok nájde, vráti sa true , ak nie, vráti sa false . |
size() | Vráti dĺžku frontu blokovania polí. |
toArray() | Skonvertuje rad blokujúcich polí na pole a vráti ho. |
toString() | Skonvertuje rad blokujúcich polí na reťazec |
Prečo používať ArrayBlockingQueue?
K ArrayBlockingQueue
použitie poľa ako jeho vnútornej pamäte.
Považuje sa za kolekciu bezpečnú pre vlákna . Preto sa všeobecne používa v aplikáciách s viacerými vláknami.
Predpokladajme, že jedno vlákno vkladá prvky do frontu a iné vlákno odstraňuje prvky z frontu.
Ak je teraz prvé vlákno pomalšie ako druhé vlákno, potom môže front blokovania polí spôsobiť, že druhé vlákno počká, kým prvé vlákno dokončí svoje operácie.