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. Gibtfalse
zurück wenn die Warteschlange voll ist.peek()
- Gibt den Kopf der blockierenden Warteschlange zurück. Gibtnull
zurück wenn die Warteschlange leer ist.poll()
- Entfernt ein Element aus der Sperrwarteschlange. Gibtnull
zurü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