Java LinkedBlockingQueue

V tomto tutoriále sa pomocou príkladov dozvieme o triede LinkedBLockingQueue a jej metódach.

LinkedBlockingQueueTrieda Java Collectionsrámca zabezpečuje realizáciu blokovanie fronty pomocou prepojeného zoznamu.

Implementuje rozhranie Java BlockingQueue.

Vytvára sa LinkedBlockingQueue

Ak chcete vytvoriť prepojený blokujúci blok, musíme importovať java.util.concurrent.LinkedBlockingQueuebalík.

Takto môžeme vytvoriť prepojený blokujúci blok v prostredí Java:

1. Bez počiatočnej kapacity

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Tu bude predvolená počiatočná kapacita 2 31 -1.

2. S počiatočnou kapacitou

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Tu,

  • Typ - typ prepojeného blokovania
  • kapacita - veľkosť prepojeného blokovania frontu

Napríklad,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Poznámka: Nie je povinné uvádzať veľkosť prepojeného zoznamu.

Metódy LinkedBlockingQueue

LinkedBlockingQueueTrieda poskytuje realizáciu všetkých metód v rozhraní BlockingQueue.

Tieto metódy sa používajú na vkladanie, prístup a mazanie prvkov z prepojených blokovacích radov.

Tiež sa dozvieme o dvoch metód put()a take()tejto podpory blokovanie premávky v prepojené blokovanie fronty.

Tieto dve metódy rozlišujú prepojený blokujúci front od iných typických frontov.

Vložiť prvky

  • add()- Vloží zadaný prvok do prepojeného frontu blokovania. Ak je fronta plná, vyvolá výnimku.
  • offer()- Vloží zadaný prvok do prepojeného frontu blokovania. Vráti sa, falseak je rad plný.

Napríklad,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Výkon

 LinkedBlockingQueue: (pes, mačka, kôň) 

Prístupové prvky

  • peek()- Vráti prvok z prednej časti prepojeného blokovania. Vráti sa, nullak je rad prázdny.
  • iterator()- Vráti objekt iterátora, aby postupne získal prístup k prvku z prepojeného blokovania frontu. Ak je rad prázdny, vyvolá výnimku. Aby sme mohli java.util.Iteratorbalík použiť, musíme ho importovať .

Napríklad,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Výkon

 LinkedBlockingQueue: (pes, mačka, kôň) Pristupovaný prvok: Pes LinkedBlockingQueue prvky: pes, mačka, kôň, 

Odstrániť prvky

  • remove()- Vráti a odstráni zadaný prvok z prepojeného blokovania. Ak je rad prázdny, hodí výnimku.
  • poll()- Vráti a odstráni zadaný prvok z prepojeného blokovania. Vráti sa, nullak je rad prázdny.
  • clear() - Odstráni všetky prvky z prepojeného blokovania.

Napríklad,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + 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 LinkedBlockingQueue " + animals); ) ) 

Výkon

 LinkedBlockingQueue: (Pes, Mačka, Kôň) Odstránené prvky: Pomocou remove (): Pes pomocou ankety (): Mačka Aktualizovaná LinkedBlockingQueue: () 

put () a take () metódy

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ť.

put () metóda

Na vloženie zadaného prvku na koniec prepojeného poradia blokovania použijeme put()metódu.

Ak je prepojený blokujúci front plný, počká, kým v prepojenom blokovaní frontu nebude miesto na vloženie prvku.

Napríklad,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Výkon

 LinkedBlockingQueue: (pes, mačka) 

Tu môže put()metóda hodiť, InterruptedExceptionak 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 časti prepojeného poradia blokovania môžeme použiť túto take()metódu.

Ak je prepojený blokujúci front prázdny, čaká sa na odstránenie prvkov v prepojenom blokovaní frontu.

Napríklad,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Výkon

 LinkedBlockingQueue: (pes, mačka) Odstránený prvok: pes Nové LinkedBlockingQueue: (mačka) 

Tu take()metóda hodí InterrupedExceptionak je prerušená počas čakania. Preto ho musíme uzavrieť do try… catchbloku.

Iné metódy

Metódy Popisy
contains(element) Vyhľadá zadaný prvok v prepojenom rade blokovaní. Ak sa prvok nájde, vráti sa true, ak nie, vráti sa false.
size() Vráti dĺžku prepojeného blokovania.
toArray() Skonvertuje prepojený blokujúci rad na pole a vráti pole.
toString() Skonvertuje prepojený blokujúci rad na reťazec

Prečo používať LinkedBlockingQueue?

K LinkedBlockingQueuepoužitie súvisí zoznamy 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 prepojený blokujúci rad môže spôsobiť, že druhé vlákno počká, kým prvé vlákno dokončí svoje operácie.

Zaujímavé články...