Co to jest bezpieczna dla wątków kolejka blokowania w Javie? Kiedy należy go używać? Załączona implementacja

Opublikowany: 2021-04-30
Co to jest Threadsafe BlockingQueue w Javie i kiedy należy jej używać?

Do tej pory napisałem dwa artykuły na temat koncepcji Producer Consumer na Crunchify. Pierwszy wyjaśniający Java Semaphore i Mutex, a drugi wyjaśniający współbieżny odczyt/zapis.

W tym samouczku Java omówimy tę samą koncepcję producenta/konsumentu, aby wyjaśnić BlockingQueue in Java .

Jakie są zalety kolejki blokowania w Javie?

java.util.Queue obsługuje operacje, które czekają, aż kolejka stanie się niepusta podczas pobierania elementu i czekają, aż miejsce w kolejce stanie się dostępne podczas przechowywania elementu.

java.util.BlockingQueue w java - Crunchify

Musimy stworzyć cztery klasy Java:

  1. CrunchifyMessage.java umieścić i otrzymać wiadomość
  2. CrunchifyBlockingProducer.java, aby umieścić wiadomość w kolejce
  3. CrunchifyBlockingConsumer.java, aby pobrać wiadomość z kolejki
  4. CrunchifyBlockingMain.java, aby rozpocząć test

Implementacje BlockingQueue są thread-safe . Wszystkie metody kolejkowania mają charakter atomowy i wykorzystują wewnętrzne blokady.

Zacznijmy od implementacji Thread-Safe BlockingQueue w Javie

Krok 1

Utwórz klasę CrunchifyMessage.java . To jest prosty obiekt Java.

Krok 2

Utwórz producenta CrunchifyBlockingProducer.java , który utworzył prostą wiadomość i umieścił ją w kolejce.

Krok 3

Utwórz klasę CrunchifyBlockingConsumer.java , która zużywa wiadomość z kolejki.

Krok 4

Utwórz prostą metodę CrunchifyBlockingMain.java , która uruchamia test BlockingQueue. Uruchom ten program, aby sprawdzić zachowanie BlockingQueue.

BlockingQueue nie akceptuje elementów o wartości null . Implementacje generują NullPointerException przy próbach dodania , umieszczenia lub zaoferowania wartości null .

Wartość null jest używana jako wartość wskaźnikowa wskazująca niepowodzenie operacji odpytywania .

Wynik:

Kiedy powinniśmy używać java.util.concurrent.BlockingQueue?

  • Jeśli chcesz ograniczyć przychodzące żądanie, powinieneś użyć tego samego
  • Dzięki niekończącej się kolejce producenci mogą wyprzedzić konsumentów. Jeśli konsument nie dogania producenta, może to spowodować OutOfMemoryError . W takich sytuacjach może lepiej zasygnalizować niedoszłemu producentowi, że kolejka jest pełna, i szybko zrezygnować z awarii.
    • Innymi słowy: producenci są naturalnie dławieni.
  • Kolejka blokowania jest zwykle używana w aplikacji współbieżnej
  • Zapewnia poprawną, bezpieczną wątkowo implementację
  • Zużycie pamięci również powinno być ograniczone