Interfejs Java BlockingQueue

W tym samouczku dowiemy się o interfejsie Java BlockingQueue i jego metodach.

BlockingQueueInterfejs Java Collectionsramach rozszerza Queueinterfejs. 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ż BlockingQueuejest 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.BlockingQueuepakiet, 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 ArrayBlockingQueuei LinkedBlockingQueue. Obiekty te mogą korzystać z funkcjonalności BlockingQueueinterfejsu.

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, falsejeśli kolejka jest pełna.
  • peek()- zwraca początek kolejki blokującej. Zwraca, nulljeśli kolejka jest pusta.
  • poll()- Usuwa element z kolejki blokującej. Zwraca, nulljeś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 100milisekundy. 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, microsecondsi nanosecondsw offer()i poll()metody.

Metody blokujące operację

BlockingQueueZapewnia 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 BlockingQueuejest 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.

Interesujące artykuły...