W tym samouczku dowiemy się o klasie ArrayBlockingQueue i jej metodach na przykładach.
ArrayBlockingQueue
Klasa ramach kolekcje Java zapewnia realizację blokowania kolejki po tablicy.
Implementuje interfejs Java BlockingQueue.
Tworzenie ArrayBlockingQueue
Aby utworzyć kolejkę blokującą tablice, musimy zaimportować java.util.concurrent.ArrayBlockingQueue
pakiet.
Po zaimportowaniu pakietu, oto jak możemy utworzyć kolejkę blokującą tablice w Javie:
ArrayBlockingQueue animal = new ArrayBlockingQueue(int capacity);
Tutaj,
- Typ - typ kolejki blokującej tablicę
- pojemność - rozmiar kolejki blokującej tablicę
Na przykład,
// Creating String type ArrayBlockingQueue with size 5 ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Creating Integer type ArrayBlockingQueue with size 5 ArrayBlockingQueue age = new ArrayBlockingQueue(5);
Uwaga: Podanie rozmiaru tablicy jest obowiązkowe.
Metody ArrayBlockingQueue
ArrayBlockingQueue
Klasa zapewnia realizację wszystkich metod w BlockingQueue
interfejsie.
Te metody służą do wstawiania, uzyskiwania dostępu i usuwania elementów z kolejek blokujących tablice.
Dowiemy się również o dwóch metodach put()
i take()
obsługujących operację blokowania w kolejce blokowania tablicy.
Te dwie metody odróżniają kolejkę blokującą tablicę od innych typowych kolejek.
Wstaw elementy
add()
- Wstawia określony element do kolejki blokowania tablicy. Zgłasza wyjątek, jeśli kolejka jest pełna.offer()
- Wstawia określony element do kolejki blokowania tablicy. Zwraca,false
jeśli kolejka jest pełna.
Na przykład,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("ArrayBlockingQueue: " + animals); ) )
Wynik
ArrayBlockingQueue: (Pies, Kot, Koń)
Access Elements
peek()
- Zwraca element z początku kolejki blokującej tablicę. Zwraca,null
jeśli kolejka jest pusta.iterator()
- Zwraca obiekt iteratora w celu sekwencyjnego dostępu do elementów z kolejki blokującej tablicę. 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.ArrayBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("ArrayBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) )
Wynik
ArrayBlockingQueue: (pies, kot, koń) Dostępny element: pies ArrayBlocking Elementy kolejki: pies, kot, koń,
Usuń elementy
remove()
- Zwraca i usuwa określony element z kolejki blokowania tablicy. Zgłasza wyjątek, jeśli kolejka jest pusta.poll()
- Zwraca i usuwa określony element z kolejki blokowania tablicy. Zwraca,null
jeśli kolejka jest pusta.clear()
- Usuwa wszystkie elementy z kolejki blokowania tablicy.
Na przykład,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + 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 ArrayBlockingQueue: " + animals); ) )
Wynik
ArrayBlockingQueue: (Pies, Kot, Koń) Usunięte elementy: Używanie remove (): Dog Używanie poll (): Cat Zaktualizowano ArrayBlockingQueue: ()
metoda 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 dodać element na koniec kolejki blokującej tablicę, możemy użyć put()
metody.
Jeśli kolejka blokująca tablicę jest pełna, czeka, aż w kolejce blokującej tablicę będzie miejsce na dodanie elementu.
Na przykład,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) )
Wynik
ArrayBlockingQueue: (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 kolejki blokującej tablicę, możemy użyć take()
metody.
Jeśli kolejka blokująca tablicę jest pusta, czeka, aż w kolejce blokującej tablicę znajdą się elementy do usunięcia.
Na przykład,
import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( ArrayBlockingQueue animals = new ArrayBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); ) catch(Exception e) ( System.out.println(e); ) ) )
Wynik
ArrayBlockingQueue: (Pies, Kot) Usunięty element: Pies
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 kolejkę blokującą tablicę pod kątem określonego elementu. Jeśli element zostanie znaleziony, zwraca true , jeśli nie, zwraca false . |
size() | Zwraca długość kolejki blokującej tablicę. |
toArray() | Konwertuje kolejkę blokującą tablicę na tablicę i zwraca ją. |
toString() | Konwertuje kolejkę blokującą tablicę na ciąg |
Dlaczego warto korzystać z ArrayBlockingQueue?
Do ArrayBlockingQueue
zastosowania jako tablicami 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, kolejka blokująca tablicę może sprawić, że drugi wątek będzie czekał, aż pierwszy wątek zakończy swoje operacje.