Rozhraní Java BlockingQueue

V tomto kurzu se dozvíme o rozhraní Java BlockingQueue a jeho metodách.

BlockingQueueRozhraní Java Collectionsrámce rozšiřuje Queuerozhraní. 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 BlockingQueuejde 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.BlockingQueuebalíč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 ArrayBlockingQueuea LinkedBlockingQueue, resp. Tyto objekty mohou využívat funkce BlockingQueuerozhraní.

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, falsepokud je fronta plná.
  • peek()- Vrátí hlavu blokující fronty. Vrátí se, nullpokud je fronta prázdná.
  • poll()- Odebere prvek z fronty blokování. Vrátí se, nullpokud 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 100milisekund. 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, microsecondsa nanosecondsv offer()a poll()metody.

Metody, které blokují operaci

BlockingQueueTaké 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ě BlockingQueuese 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.

Zajímavé články...