Sučelje Java BlockingQueue

U ovom uputstvu naučit ćemo o sučelju Java BlockingQueue i njegovim metodama.

BlockingQueueSučelje Java Collectionsokvir proširuje Queuesuč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 BlockingQueueje 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.BlockingQueuepaket 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 ArrayBlockingQueuei LinkedBlockingQueue, respektivno. Ti objekti mogu koristiti funkcionalnosti BlockingQueuesuč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ća falseako je red pun.
  • peek()- Vraća glavu reda za blokiranje. Vraća nullako je red prazan.
  • poll()- Uklanja element iz reda blokiranja. Vraća nullako 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 100milisekunde. 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, microsecondsi nanosecondsza offer()te poll()metode.

Metode koje blokiraju operaciju

BlockingQueueTakođ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 BlockingQueuese 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.

Zanimljivi članci...