Co to jest BlockingQueue w Javie i jak go zaimplementować?



Ten artykuł o BlockingQueue w Javie pomoże ci poznać interfejs BlockingQueue. Zapewni także wgląd w jego metody i praktyczne wdrożenie

jest niezwykle popularny wśród programistów ze względu na szeroki zakres wbudowanych funkcji. W większości przypadków będziesz mieć dedykowane rozwiązanie problemu, zanim się on pojawi. Taka niezwykle przydatna i ważna część to interfejs BlockingQueue w Javie. Za pośrednictwem tego artykułu rzucę nieco światła na BlockingQueue w Javie i metody jego implementacji.

Poniżej znajdują się tematy poruszone w tym artykule:





BlockingQueue Interface w Javie

BlockingQueue w Javie to interfejs, który został dodany w Javie 1.5 wraz z kilkoma innymi współbieżnymi klasami Utility, takimi jak ConcurrentHashMap, CopyOnWriteArrrayList itp. Interfejs BlockingQueue należy do java.util.concurrent pakiet .Ten interfejs zwiększa kontrolę przepływu, aktywując blokowanie na wypadek, gdyby wątek próbował usunąć z kolejki pustą kolejkę lub umieścić w kolejce pełną kolejkę. W obu przypadkach ten interfejs jest przydatny.Mówiąc prościej, załóżmy, że plik próbuje dodać elementy do już pełnej kolejki. W tym momencie programu zostanie wywołana BlockingQueue, która będzie blokować ten konkretny wątek, dopóki inny wątek nie zwolni kolejki, aby zwolnić miejsce. Może to być wynikiem odkolejkowania elementu (ów) rozliczenia całej kolejki. Podobnie BlockingQueue zostanie wywołana, aby zablokować wątek próbujący usunąć z kolejki już pustą kolejkę, dopóki inny wątek nie wstawi lub nie doda elementu do pustej kolejka .

Pracując z interfejsem BlockingQueue w Javie należy pamiętać, że nie akceptuje on wartości null. Jeśli spróbujesz to zrobić, natychmiast zgłosi wyjątek NullPointerException. Poniższy rysunek przedstawia działanie interfejsu BlockingQueue w Javie.



BlockingQueue - BlockingQueue w Javie - EdurekaTo berło jest używany głównie między producentami i konsumentami, ponieważ jest bezpieczny dla wątków.Mam na myśli to, że interfejs BlockingQueue może służyć do tworzenia kolejki, która może być współdzielona zarówno przez producenta, jak i konsumenta

Aby pracować z BlockingQueue w Javie, musisz najpierw zapoznać się z jego typami. Pozwólcie, że przedstawię wam je w następnej części tego artykułu.

Typy konstruktorów BlockingQueue w Javie

Istnieją dwa typy konstruktorów dla interfejsu BlockingQueue w Javie:



  • Nieograniczona kolejka: W przypadku tego typu kolejki pojemność zostanie ustawiona na Integer.MAX_VALUE. Nieograniczona kolejka nigdy nie zostanie zablokowana, ponieważ może dynamicznie rosnąć za każdym razem, gdy zostanie do niej wstawiony element. Poniżej znajduje się składnia tworzenia nieograniczonej kolejki:
BlockingQueue bq = new LinkedBlockingDeque ()
  • Ograniczona kolejka: W przypadku tego rodzaju kolejki należy przekazać pojemność kolejki w momencie jej utworzenia, czyli jako plik budowniczy parametr. Po przypisaniu rozmiaru nie można go zmienić. Poniżej znajduje się składnia tworzenia ograniczonej kolejki:
BlockingQueue bq = new LinkedBlockingDeque (10)

Teraz, gdy znasz już sposoby implementacji BlockingQueue w Javie, pozwól mi wymienić kilka z jego metod.

Metody w interfejsie BlockingQueue

metoda Opis
add boolean (E e) Ta metoda pomaga wstawić określony element do tej kolejki, jeśli w kolejce jest miejsce, w przeciwnym razie będzierzućIllegalStateException
boolean zawiera (obiekt o) Ta metoda zwraca wartość true, jeśli kolejka zawiera określony element
int drainTo (Kolekcja c) Ta metoda usunie wszystkie dostępne elementy z kolejki i doda je do określonej kolekcji
int drainTo (kolekcja c, int maxElements) Ta metoda usunie podaną liczbę dostępnych elementów z kolejki i doda je do określonej
oferta booloean (E e) Ta metoda wstawi określony element do kolejki, jeśli nie jest pełny i zwróci wartość true, w przeciwnym razie zwróci false
oferta logiczna (E e, długi limit czasu, jednostka TimeUnit) Ta metoda wstawi określony element do kolejki. W przypadku, gdy kolejka jest pełna, będzie czekać do określonego czasu oczekiwania na zwolnienie miejsca.
E ankieta (długi limit czasu, jednostka TimeUnit) Ta metoda pomaga w pobieraniu i usuwaniu nagłówka kolejki. W przypadku, gdy kolejka jest pusta, będzie czekać do określonego czasu oczekiwania na udostępnienie elementu
void put (E e) Ta metoda wstawi określony element do kolejki, czekając na zwolnienie miejsca w przypadku zapełnienia kolejki
int pozostałyCapacity () Ta metoda pomaga w zwróceniu liczby dodatkowych elementów, które ta kolejka może idealnie zaakceptować bez blokowania
boolean remove (Object o) Ta metoda usunie pojedyncze wystąpienie określonego elementu z kolejki tylko wtedy, gdy jest obecne
E wziąć () Ta metoda pomoże w pobieraniu i usuwaniu nagłówka kolejki poprzez oczekiwanie na udostępnienie elementu, w przypadku gdy kolejka jest pusta.

Implementacje BlockingQueue

Tutaj zaimplementuję prosty przykład BlockingQueue w Javie, gdzieKlasa EduProducer będzie generować dane i wstawiać je do pliku kolejka jednocześnie inna klasa, EduConsumer, usunie dane z tej samej kolejki.

W tym celu utworzę 3 klasy, a mianowicie:

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

Utwórzmy teraz po kolei każdą z tych klas.

EduProducer.java

pakiet edureka import java.util.concurrent.BlockingQueue klasa publiczna EduProducer implementuje Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). przerwanie ()} } private void process () rzuca InterruptedException {// Umieść 10 int w kolejce for (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

jak korzystać z programu Visual Studio
pakiet edureka import java.util.concurrent.BlockingQueue klasa publiczna EduConsumer implementuje Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Przerwanie ()}} prywatny void proces (Integer take) rzuca InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} public EduConsumer (BlockingQueue queue) {this.queue = queue}}

EdurekaMain.java

pakiet edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (nowy EduProducer (kolejka)) .start () nowy wątek (nowy EduConsumer (kolejka)). start ()}}

Gdy skończysz pisać kod, uruchom program, aby uzyskać poniższe dane wyjściowe:

[Producent] Dodaj: 0 [Konsument] Take: 0 [Producent] Pozostała pojemność kolejki: 9 [Producent] Dodaj: 1 [Producent] Pozostała pojemność kolejki: 9 [Producent] Dodaj: 2 [Producent] Pozostała pojemność kolejki: 8 [Producent ] Dodaj: 3 [Producent] Pozostała pojemność kolejki: 7 [Konsument] Take: 1 [Producent] Dodaj: 4 [Producent] Pozostała pojemność kolejki: 7 [Producent] Dodaj: 5 [Producent] Pozostała pojemność kolejki: 6 [Producent] Dodaj : 6 [Producent] Pozostała pojemność kolejki: 5 [Konsument] Take: 2 [Producent] Dodaj: 7 [Producent] Pozostała pojemność kolejki: 5 [Producent] Dodaj: 8 [Producent] Pozostała pojemność kolejki: 4 [Producent] Dodaj: 9 [Producent] Pozostała pojemność kolejki: 3 [Konsument] Take: 3 [Konsument] Take: 4 [Konsument] Take: 5 [Konsument] Take: 6 [Konsument] Take: 7 [Konsument] Take: 8 [Konsument] Take: 9

To prowadzi nas do końca tego artykułu o BlockingQueue w Javie. Jeśli chcesz poznać bardziej szczegółowo język Java, możesz skorzystać z naszego także.

Teraz, gdy znasz już podstawy BlockingQueue w Javie, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie i certyfikacja Java J2EE i SOA Edureka jest przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistami Java. Kurs ma na celu dać ci przewagę w programowaniu w języku Java i przeszkolić zarówno w zakresie podstawowych, jak i zaawansowanych koncepcji Java, a także różnych struktur Java, takich jak Hibernate i Spring.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy w tej „BlockingQueue in Java”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.