V tomto tutoriále sa pomocou príkladov dozvieme o triede LinkedBLockingQueue a jej metódach.
LinkedBlockingQueue
Trieda Java Collections
rá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.LinkedBlockingQueue
balí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
LinkedBlockingQueue
Trieda 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,false
ak 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,null
ak 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 mohlijava.util.Iterator
balí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,null
ak 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ť, 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 č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í 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á 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 LinkedBlockingQueue
použ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.