U ovom uputstvu naučit ćemo o sučelju Java BlockingQueue i njegovim metodama.
BlockingQueue
Sučelje Java Collections
okvir proširuje Queue
sučelje. Omogućuje bilo kojoj operaciji da pričeka dok se ne može uspješno izvršiti.
Na primjer, ako želimo izbrisati element iz praznog reda, tada red za blokiranje omogućuje operaciji brisanja da pričeka dok red ne sadrži neke elemente za brisanje.
Klase koje implementiraju BlockingQueue
Budući da BlockingQueue
je sučelje, ne možemo ga osigurati izravnom provedbom.
Da bismo koristili funkcionalnost BlockingQueue
, trebamo koristiti klase koje je implementiraju.
- ArrayBlockingQueue
- LinkedBlockingQueue
Kako koristiti blokirajuće redove?
Moramo uvesti java.util.concurrent.BlockingQueue
paket da bismo ga mogli koristiti BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Ovdje smo stvorili objekte animal1 i animal2 klasa ArrayBlockingQueue
i LinkedBlockingQueue
, respektivno. Ti objekti mogu koristiti funkcionalnosti BlockingQueue
sučelja.
Metode BlockingQueue
Na temelju je li red čekanja pun ili prazan, metode blokiranja reda mogu se podijeliti u 3 kategorije:
Metode koje donose iznimku
add()
- Umeta element u red za blokiranje na kraju reda. Baca iznimku ako je red pun.element()
- Vraća glavu reda za blokiranje. Baca iznimku ako je red prazan.remove()
- Uklanja element iz reda blokiranja. Baca iznimku ako je red prazan.
Metode koje vraćaju neku vrijednost
offer()
- Ubacuje navedeni element u red za blokiranje na kraju reda. Vraćafalse
ako je red pun.peek()
- Vraća glavu reda za blokiranje. Vraćanull
ako je red prazan.poll()
- Uklanja element iz reda blokiranja. Vraćanull
ako je red prazan.
Više u ponudi () i anketa ()
Metoda offer()
i poll()
može se koristiti s vremenskim ograničenjima. Odnosno, vremenske jedinice možemo proslijediti kao parametar. Na primjer,
offer(value, 100, milliseconds)
Ovdje,
- vrijednost je element koji se ubacuje u red čekanja
- I postavili smo vremensko ograničenje od 100 milisekundi
To znači da offer()
će metoda pokušati umetnuti element u red blokiranja na 100
milisekunde. Ako se element ne može umetnuti za 100 milisekundi, metoda se vraća false
.
Napomena: Umjesto milliseconds
, mi također mogu koristiti ove vremenske jedinice: days
, hours
, minutes
, seconds
, microseconds
i nanoseconds
za offer()
te poll()
metode.
Metode koje blokiraju operaciju
BlockingQueue
Također pruža metode za blokiranje poslovanja i čekati ako je red pun ili prazan.
put()
- Umeta element u red za blokiranje. Ako je red pun, pričekat će dok red nema mjesta za umetanje elementa.take()
- Uklanja i vraća element iz reda blokiranja. Ako je red prazan, pričekat će dok red ne sadrži elemente za brisanje.
Pretpostavimo da želimo umetnuti elemente u red čekanja. Ako je red pun, tada će put()
metoda pričekati dok red nema mjesta za umetanje elemenata.
Slično tome, ako želimo izbrisati elemente iz reda. Ako je red prazan, take()
metoda će pričekati dok red ne sadrži elemente za brisanje.
Implementacija BlockingQueue u 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(); ) ) )
Izlaz
BlockingQueue: (2, 1, 3) Uklonjeni element: 2
Da biste saznali više o ArrayBlockingQueue
, posjetite Java ArrayBlockingQueue.
Zašto BlockingQueue?
U Javi BlockingQueue
se smatra kolekcijom sigurnom za nit . To je zato što može biti korisno u operacijama s više niti.
Pretpostavimo da jedna nit ubacuje elemente u red, a druga nit uklanja elemente iz reda.
Sada, ako prva nit radi sporije, tada red za blokiranje može natjerati drugu nit da pričeka dok prva nit dovrši svoj rad.