W tym samouczku dowiemy się o interfejsie Java BlockingQueue i jego metodach.
BlockingQueue
Interfejs Java Collections
ramach rozszerza Queue
interfejs. Pozwala to każdej operacji czekać, aż zostanie pomyślnie wykonana.
Na przykład, jeśli chcemy usunąć element z pustej kolejki, to kolejka blokująca pozwala na odczekanie operacji usuwania, aż kolejka będzie zawierała elementy do usunięcia.
Klasy implementujące BlockingQueue
Ponieważ BlockingQueue
jest to interfejs, nie możemy zapewnić jego bezpośredniej implementacji.
Aby skorzystać z funkcjonalności programu BlockingQueue
, musimy skorzystać z klas, które go implementują.
- ArrayBlockingQueue
- LinkedBlockingQueue
Jak korzystać z kolejek blokujących?
Musimy zaimportować java.util.concurrent.BlockingQueue
pakiet, aby użyć BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Tutaj stworzyliśmy obiekty zwierzę1 i zwierzę2 odpowiednio z klas ArrayBlockingQueue
i LinkedBlockingQueue
. Obiekty te mogą korzystać z funkcjonalności BlockingQueue
interfejsu.
Metody BlockingQueue
W zależności od tego, czy kolejka jest pełna, czy pusta, metody kolejki blokującej można podzielić na 3 kategorie:
Metody, które zgłaszają wyjątek
add()
- Wstawia element do kolejki blokującej na końcu kolejki. Zgłasza wyjątek, jeśli kolejka jest pełna.element()
- zwraca początek kolejki blokującej. Zgłasza wyjątek, jeśli kolejka jest pusta.remove()
- Usuwa element z kolejki blokującej. Zgłasza wyjątek, jeśli kolejka jest pusta.
Metody, które zwracają pewną wartość
offer()
- Wstawia określony element do kolejki blokującej na końcu kolejki. Zwraca,false
jeśli kolejka jest pełna.peek()
- zwraca początek kolejki blokującej. Zwraca,null
jeśli kolejka jest pusta.poll()
- Usuwa element z kolejki blokującej. Zwraca,null
jeśli kolejka jest pusta.
Więcej o ofercie () i ankiecie ()
Metody offer()
i poll()
można używać z limitami czasu. Oznacza to, że jako parametr możemy podać jednostki czasu. Na przykład,
offer(value, 100, milliseconds)
Tutaj,
- wartość to element, który ma zostać wstawiony do kolejki
- Ustawiliśmy limit czasu równy 100 milisekund
Oznacza to, że offer()
metoda będzie próbowała wstawić element do kolejki blokującej na 100
milisekundy. Jeśli elementu nie można wstawić w ciągu 100 milisekund, metoda zwraca false
.
Uwaga: Zamiast milliseconds
, możemy również korzystać z tych jednostek czasu: days
, hours
, minutes
, seconds
, microseconds
i nanoseconds
w offer()
i poll()
metody.
Metody blokujące operację
BlockingQueue
Zapewnia również sposoby blokowania działania i czekać, czy kolejka jest pełny lub pusty.
put()
- Wstawia element do kolejki blokującej. Jeśli kolejka jest pełna, będzie czekać, aż będzie w niej miejsce na wstawienie elementu.take()
- Usuwa i zwraca element z kolejki blokującej. Jeśli kolejka jest pusta, będzie czekać, aż kolejka będzie zawierała elementy do usunięcia.
Załóżmy, że chcemy wstawić elementy do kolejki. Jeśli kolejka jest pełna, put()
metoda zaczeka, aż kolejka będzie miała miejsce na wstawienie elementów.
Podobnie, jeśli chcemy usunąć elementy z kolejki. Jeśli kolejka jest pusta, take()
metoda będzie czekać, aż kolejka zawiera elementy do usunięcia.
Implementacja BlockingQueue w 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(); ) ) )
Wynik
BlockingQueue: (2, 1, 3) Usunięty element: 2
Aby dowiedzieć się więcej ArrayBlockingQueue
, odwiedź stronę Java ArrayBlockingQueue.
Dlaczego BlockingQueue?
W Javie BlockingQueue
jest to kolekcja bezpieczna wątkowo. Dzieje się tak, ponieważ może być pomocny w operacjach 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 działa wolniej, kolejka blokująca może sprawić, że drugi wątek zaczeka, aż pierwszy wątek zakończy działanie.