V tomto kurzu se dozvíme o rozhraní Java BlockingQueue a jeho metodách.
BlockingQueue
Rozhraní Java Collections
rámce rozšiřuje Queue
rozhraní. Umožňuje jakékoli operaci počkat, dokud ji nebude možné úspěšně provést.
Například pokud chceme odstranit prvek z prázdné fronty, pak blokující fronta umožňuje operaci odstranění počkat, dokud fronta neobsahuje některé prvky, které mají být odstraněny.
Třídy, které implementují BlockingQueue
Protože BlockingQueue
jde o rozhraní, nemůžeme zajistit jeho přímou implementaci.
Abychom mohli používat funkčnost BlockingQueue
, musíme použít třídy, které ji implementují.
- ArrayBlockingQueue
- LinkedBlockingQueue
Jak používat blokující fronty?
Abychom mohli java.util.concurrent.BlockingQueue
balíček použít, musíme jej importovat BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Zde jsme vytvořili objekty animal1 a animal2 tříd ArrayBlockingQueue
a LinkedBlockingQueue
, resp. Tyto objekty mohou využívat funkce BlockingQueue
rozhraní.
Metody BlockingQueue
Na základě toho, zda je fronta plná nebo prázdná, lze metody blokující fronty rozdělit do 3 kategorií:
Metody, které vyvolávají výjimku
add()
- Vloží prvek do blokující fronty na konci fronty. Pokud je fronta plná, vyvolá výjimku.element()
- Vrátí hlavu blokující fronty. Vyvolá výjimku, pokud je fronta prázdná.remove()
- Odebere prvek z fronty blokování. Vyvolá výjimku, pokud je fronta prázdná.
Metody, které vracejí určitou hodnotu
offer()
- Vloží určený prvek do blokující fronty na konci fronty. Vrátí se,false
pokud je fronta plná.peek()
- Vrátí hlavu blokující fronty. Vrátí se,null
pokud je fronta prázdná.poll()
- Odebere prvek z fronty blokování. Vrátí se,null
pokud je fronta prázdná.
Více v nabídce () a hlasování ()
offer()
A poll()
způsob může být použit s časové limity. To znamená, že můžeme předat časové jednotky jako parametr. Například,
offer(value, 100, milliseconds)
Tady,
- value je prvek, který má být vložen do fronty
- A nastavili jsme časový limit 100 milisekund
To znamená, že se offer()
metoda pokusí vložit prvek do fronty blokování po dobu 100
milisekund. Pokud prvek nelze vložit za 100 milisekund, vrátí se metoda false
.
Poznámka: Místo milliseconds
, můžeme také použít tyto časové jednotky: days
, hours
, minutes
, seconds
, microseconds
a nanoseconds
v offer()
a poll()
metody.
Metody, které blokují operaci
BlockingQueue
Také poskytuje metody blokovat operace a čekat, pokud je fronta prázdná nebo plná.
put()
- Vloží prvek do fronty blokování. Pokud je fronta plná, bude čekat, až bude mít fronta prostor pro vložení prvku.take()
- Odebere a vrátí prvek z fronty blokování. Pokud je fronta prázdná, bude čekat, dokud nebude mít fronta prvky, které mají být odstraněny.
Předpokládejme, že chceme vložit prvky do fronty. Pokud je fronta plná, bude put()
metoda čekat, dokud nebude mít fronta prostor pro vložení prvků.
Podobně, pokud chceme odstranit prvky z fronty. Pokud je fronta prázdná, bude take()
metoda čekat, dokud fronta nebude obsahovat prvky, které mají být odstraněny.
Implementace 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ýstup
BlockingQueue: (2, 1, 3) Odstraněný prvek: 2
Chcete-li se dozvědět více ArrayBlockingQueue
, navštivte Java ArrayBlockingQueue.
Proč BlockingQueue?
V Javě BlockingQueue
se považuje za kolekci bezpečnou pro vlákna . Je to proto, že to může být užitečné při operacích s více vlákny.
Předpokládejme, že jedno vlákno vkládá prvky do fronty a jiné vlákno odebírá prvky z fronty.
Nyní, pokud první vlákno běží pomaleji, může blokovací fronta způsobit, že druhé vlákno počká, dokud první vlákno nedokončí svou činnost.