V tomto výučbe sa dozvieme o rozhraní Java BlockingQueue a jeho metódach.
BlockingQueue
Rozhranie Java Collections
rámca rozširuje Queue
rozhranie. Umožňuje akejkoľvek operácii počkať, kým ju bude možné úspešne vykonať.
Napríklad, ak chceme vymazať prvok z prázdneho frontu, potom blokujúci front umožňuje operácii mazania počkať, kým front nebude obsahovať niektoré prvky na odstránenie.
Triedy, ktoré implementujú BlockingQueue
Pretože BlockingQueue
ide o rozhranie, nemôžeme zabezpečiť jeho priamu implementáciu.
Aby sme mohli využívať funkcionalitu BlockingQueue
, musíme použiť triedy, ktoré ju implementujú.
- ArrayBlockingQueue
- LinkedBlockingQueue
Ako používať blokujúce rady?
Aby sme mohli java.util.concurrent.BlockingQueue
balík použiť, musíme ho importovať BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Tu sme vytvorili objekty animal1 a animal2 tried ArrayBlockingQueue
a LinkedBlockingQueue
, resp. Tieto objekty môžu využívať funkcie BlockingQueue
rozhrania.
Metódy BlockingQueue
Na základe toho, či je fronta plná alebo prázdna, možno metódy blokujúcej fronty rozdeliť do 3 kategórií:
Metódy, ktoré spôsobujú výnimku
add()
- Vloží prvok do poradia blokovania na konci poradia. Ak je front plný, hodí výnimku.element()
- Vráti hlavu blokujúceho frontu. Ak je rad prázdny, hodí výnimku.remove()
- Odstráni prvok z poradia blokovania. Ak je rad prázdny, hodí výnimku.
Metódy, ktoré vracajú určitú hodnotu
offer()
- Vloží zadaný prvok do poradia blokovania na konci poradia. Vráti sa,false
ak je rad plný.peek()
- Vráti hlavu blokujúceho frontu. Vráti sa,null
ak je rad prázdny.poll()
- Odstráni prvok z poradia blokovania. Vráti sa,null
ak je rad prázdny.
Viac v ponuke () a ankete ()
offer()
A poll()
spôsob môže byť použitý s časové limity. To znamená, že môžeme odovzdať časové jednotky ako parameter. Napríklad,
offer(value, 100, milliseconds)
Tu,
- value je prvok, ktorý sa má vložiť do poradia
- Nastavili sme časový limit 100 milisekúnd
To znamená, že sa offer()
metóda pokúsi vložiť prvok do poradia blokovania na 100
milisekundy. Ak prvok nemožno vložiť do 100 milisekúnd, metóda sa vráti false
.
Poznámka: Miesto milliseconds
, môžeme tiež použiť tieto časové jednotky: days
, hours
, minutes
, seconds
, microseconds
a nanoseconds
v offer()
a poll()
metódy.
Metódy, ktoré blokujú operáciu
BlockingQueue
Tiež poskytuje metódy blokovať operácie a čakať, ak je fronta prázdna alebo plná.
put()
- Vloží prvok do poradia blokovania. Ak je poradie zaplnené, počká sa, kým bude mať priestor na vloženie prvku.take()
- Odstráni a vráti prvok z poradia blokovania. Ak je poradie prázdne, počká sa, kým bude mať poradie prvkov na odstránenie.
Predpokladajme, že chceme vložiť prvky do poradia. Ak je front plný, put()
metóda počká, kým vo fronte nebude miesto na vloženie prvkov.
Podobne, ak chceme vymazať prvky z frontu. Ak je rad prázdny, potom take()
metóda počká, kým rad obsahuje prvky, ktoré sa majú vymazať.
Implementácia BlockingQueue v ArrayBlockingQueue
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Výkon
BlockingQueue: (2, 1, 3) Odstránený prvok: 2
Ak sa chcete dozvedieť viac ArrayBlockingQueue
, navštívte stránku Java ArrayBlockingQueue.
Prečo BlockingQueue?
V Jave BlockingQueue
sa považuje za kolekciu bezpečnú pre vlákna . Môže to byť totiž užitočné pri operá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 teraz prvé vlákno beží pomalšie, potom blokujúci front môže spôsobiť, že druhé vlákno počká, kým prvé vlákno dokončí svoju činnosť.