W tym samouczku za pomocą przykładów dowiemy się o klasie LinkedBLockingQueue i jej metodach.
LinkedBlockingQueue
Klasa Java Collections
ram 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.LinkedBlockingQueue
pakiet.
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
LinkedBlockingQueue
Klasa 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,false
jeś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,null
jeś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. Abyjava.util.Iterator
go 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,null
jeś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, InterruptedException
jeś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, InterrupedException
jeśli zostanie przerwana podczas oczekiwania. Dlatego musimy zamknąć go w try… catch
bloku.
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 LinkedBlockingQueue
zastosowania 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.