Java BlockingQueue
Java BlockingQueue
In diesem Tutorial lernen wir die Java BlockingQueue-Schnittstelle und ihre Methoden kennen.
Der BlockingQueue Schnittstelle von Java Collections Framework erweitert den Queue Schnittstelle. Dadurch kann jede Operation warten, bis sie erfolgreich ausgeführt werden kann.
Wenn wir beispielsweise ein Element aus einer leeren Warteschlange löschen möchten, ermöglicht die blockierende Warteschlange, dass der Löschvorgang wartet, bis die Warteschlange einige zu löschende Elemente enthält.
Klassen, die BlockingQueue implementieren
Seit BlockingQueue eine Schnittstelle ist, können wir sie nicht direkt implementieren.
Um die Funktionalität des BlockingQueue , müssen wir Klassen verwenden, die es implementieren.
- ArrayBlockingQueue
- LinkedBlockingQueue

Wie verwende ich blockierende Warteschlangen?
Wir müssen den java.util.concurrent.BlockingQueue importieren Paket, um BlockingQueue zu verwenden .
// Array implementation of BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
// LinkedList implementation of BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Hier haben wir Objekte animal1 erstellt und tier2 der Klassen ArrayBlockingQueue und LinkedBlockingQueue , beziehungsweise. Diese Objekte können die Funktionalitäten des BlockingQueue nutzen Schnittstelle.
Methoden der BlockingQueue
Basierend darauf, ob eine Warteschlange voll oder leer ist, können Methoden einer blockierenden Warteschlange in 3 Kategorien eingeteilt werden:
Methoden, die eine Ausnahme auslösen
add()- Fügt ein Element in die Sperrwarteschlange am Ende der Warteschlange ein. Löst eine Ausnahme aus, wenn die Warteschlange voll ist.element()- Gibt den Kopf der blockierenden Warteschlange zurück. Löst eine Ausnahme aus, wenn die Warteschlange leer ist.remove()- Entfernt ein Element aus der Sperrwarteschlange. Löst eine Ausnahme aus, wenn die Warteschlange leer ist.
Methoden, die einen gewissen Wert zurückgeben
offer()- Fügt das angegebene Element in die Sperrwarteschlange am Ende der Warteschlange ein. Gibtfalsezurück wenn die Warteschlange voll ist.peek()- Gibt den Kopf der blockierenden Warteschlange zurück. Gibtnullzurück wenn die Warteschlange leer ist.poll()- Entfernt ein Element aus der Sperrwarteschlange. Gibtnullzurück wenn die Warteschlange leer ist.
Mehr zu Angebot() und Umfrage()
Die offer() und poll() Methode kann mit Timeouts verwendet werden. Das heißt, wir können Zeiteinheiten als Parameter übergeben. Zum Beispiel
offer(value, 100, milliseconds)
Hier,
- Wert ist das Element, das in die Warteschlange eingefügt werden soll
- Und wir haben ein Timeout von 100 Millisekunden eingestellt
Das bedeutet offer() -Methode versucht, ein Element in die Sperrwarteschlange für 100 einzufügen Millisekunden. Wenn das Element nicht in 100 Millisekunden eingefügt werden kann, gibt die Methode false zurück .
Hinweis: Statt milliseconds , können wir auch diese Zeiteinheiten verwenden:days , hours , minutes , seconds , microseconds und nanoseconds in offer() und poll() Methoden.
Methoden, die den Vorgang blockieren
Die BlockingQueue stellt auch Methoden bereit, um die Operationen zu blockieren und zu warten, ob die Warteschlange voll oder leer ist.
put()- Fügt ein Element in die Sperrwarteschlange ein. Wenn die Warteschlange voll ist, wird gewartet, bis die Warteschlange Platz hat, um ein Element einzufügen.take()- Entfernt und gibt ein Element aus der Sperrwarteschlange zurück. Wenn die Warteschlange leer ist, wird gewartet, bis die Warteschlange zu löschende Elemente enthält.
Angenommen, wir möchten Elemente in eine Warteschlange einfügen. Wenn die Warteschlange voll ist, dann die put() -Methode wartet, bis die Warteschlange Platz zum Einfügen von Elementen hat.
Ebenso, wenn wir Elemente aus einer Warteschlange löschen möchten. Wenn die Warteschlange leer ist, dann der take() -Methode wartet, bis die Warteschlange zu löschende Elemente enthält.
Implementierung von BlockingQueue in 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<Integer> 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();
}
}
}
Ausgabe
BlockingQueue: [2, 1, 3] Removed Element: 2
Um mehr über ArrayBlockingQueue zu erfahren , besuchen Sie Java ArrayBlockingQueue.
Warum BlockingQueue?
In Java BlockingQueue gilt als threadsicher Sammlung. Dies liegt daran, dass es bei Multi-Threading-Operationen hilfreich sein kann.
Angenommen, ein Thread fügt Elemente in die Warteschlange ein und ein anderer Thread entfernt Elemente aus der Warteschlange.
Wenn nun der erste Thread langsamer läuft, kann die blockierende Warteschlange den zweiten Thread warten lassen, bis der erste Thread seine Operation abgeschlossen hat.
Java