Java LinkedBlockingQueue

W tym samouczku za pomocą przykładów dowiemy się o klasie LinkedBLockingQueue i jej metodach.

LinkedBlockingQueueKlasa Java Collectionsram zapewnia realizację blokowania kolejki przy użyciu połączonej listy.

Implementuje interfejs Java BlockingQueue.

Tworzenie LinkedBlockingQueue

Aby utworzyć połączoną kolejkę blokującą, musimy zaimportować java.util.concurrent.LinkedBlockingQueuepakiet.

Oto jak możemy stworzyć połączoną kolejkę blokującą w Javie:

1. Bez zdolności początkowej

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Tutaj domyślna początkowa pojemność będzie wynosić 2 31 -1.

2. Z początkową pojemnością

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Tutaj,

  • Typ - typ połączonej kolejki blokującej
  • pojemność - rozmiar połączonej kolejki blokowania

Na przykład,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Uwaga: podanie rozmiaru połączonej listy nie jest obowiązkowe.

Metody LinkedBlockingQueue

LinkedBlockingQueueKlasa zapewnia realizację wszystkich metod w interfejsie BlockingQueue.

Metody te służą do wstawiania, uzyskiwania dostępu i usuwania elementów z połączonych kolejek blokujących.

Ponadto, będziemy uczyć się o dwóch metodach put()i take()wspomagające pracę blokowania w połączonej kolejki blokującej.

Te dwie metody odróżniają połączoną kolejkę blokowania od innych typowych kolejek.

Wstaw elementy

  • add()- Wstawia określony element do połączonej kolejki blokowania. Zgłasza wyjątek, jeśli kolejka jest pełna.
  • offer()- Wstawia określony element do połączonej kolejki blokowania. Zwraca, falsejeśli kolejka jest pełna.

Na przykład,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Wynik

 LinkedBlockingQueue: (Pies, Kot, Koń) 

Access Elements

  • peek()- Zwraca element z początku połączonej kolejki blokowania. Zwraca, nulljeśli kolejka jest pusta.
  • iterator()- Zwraca obiekt iteratora, aby sekwencyjnie uzyskiwać dostęp do elementu z połączonej kolejki blokowania. Zgłasza wyjątek, jeśli kolejka jest pusta. Aby java.util.Iteratorgo użyć, musimy zaimportować pakiet.

Na przykład,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Wynik

 LinkedBlockingQueue: (Pies, Kot, Koń) Dostęp do elementu: Pies PowiązaneBlocking Elementy kolejki: Pies, Kot, Koń, 

Usuń elementy

  • remove()- Zwraca i usuwa określony element z połączonej kolejki blokowania. Zgłasza wyjątek, jeśli kolejka jest pusta.
  • poll()- Zwraca i usuwa określony element z połączonej kolejki blokowania. Zwraca, nulljeśli kolejka jest pusta.
  • clear() - Usuwa wszystkie elementy z połączonej kolejki blokowania.

Na przykład,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated LinkedBlockingQueue " + animals); ) ) 

Wynik

 LinkedBlockingQueue: (Pies, Kot, Koń) Usunięte elementy: Używanie remove (): Dog Używanie poll (): Cat Zaktualizowano LinkedBlockingQueue: () 

metody put () i take ()

W procesach wielowątkowych możemy używać put()i take()blokować działanie jednego wątku, aby zsynchronizować go z innym wątkiem. Te metody będą czekać, aż zostaną pomyślnie wykonane.

put () Metoda

Aby wstawić określony element na koniec połączonej kolejki blokującej, używamy put()metody.

Jeśli połączona kolejka blokowania jest pełna, czeka, aż w połączonej kolejce blokowania będzie miejsce na wstawienie elementu.

Na przykład,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Wynik

 LinkedBlockingQueue: (Pies, Kot) 

W tym przypadku put()metoda może zgłosić błąd, InterruptedExceptionjeśli zostanie przerwana podczas oczekiwania. Dlatego musimy zamknąć go w bloku try… catch.

take () Metoda

Aby zwrócić i usunąć element z przodu połączonej kolejki blokującej, możemy użyć take()metody.

Jeśli połączona kolejka blokowania jest pusta, czeka, aż w połączonej kolejce blokowania znajdą się elementy do usunięcia.

Na przykład,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Wynik

 LinkedBlockingQueue: (Pies, Kot) Usunięty element: Pies Nowy LinkedBlockingQueue: (Kot) 

W tym przypadku take()metoda wyrzuci, InterrupedExceptionjeśli zostanie przerwana podczas oczekiwania. Dlatego musimy zamknąć go w try… catchbloku.

Inne metody

Metody Opisy
contains(element) Przeszukuje połączoną kolejkę blokowania pod kątem określonego elementu. Jeśli element zostanie znaleziony, zwraca true, jeśli nie, zwraca false.
size() Zwraca długość połączonej kolejki blokowania.
toArray() Konwertuje połączoną kolejkę blokującą na tablicę i zwraca tablicę.
toString() Konwertuje połączoną kolejkę blokującą na ciąg

Dlaczego warto korzystać z LinkedBlockingQueue?

Do LinkedBlockingQueuezastosowania związane list jako jego pamięci wewnętrznej.

Jest uważana za kolekcję bezpieczną dla wątków . W związku z tym jest powszechnie używany w aplikacjach wielowątkowych.

Załóżmy, że jeden wątek wstawia elementy do kolejki, a inny wątek usuwa elementy z kolejki.

Teraz, jeśli pierwszy wątek jest wolniejszy niż drugi wątek, połączona kolejka blokująca może sprawić, że drugi wątek będzie czekał, aż pierwszy wątek zakończy swoje operacje.

Interesujące artykuły...