In diesem Tutorial lernen wir die Java BlockingQueue-Schnittstelle und ihre Methoden kennen.
Die BlockingQueue
Schnittstelle des Java- Collections
Frameworks erweitert die Queue
Schnittstelle. Damit kann jeder Vorgang warten, bis er erfolgreich ausgeführt werden kann.
Wenn Sie beispielsweise ein Element aus einer leeren Warteschlange löschen möchten, kann der Löschvorgang in der blockierenden Warteschlange warten, bis die Warteschlange einige zu löschende Elemente enthält.
Klassen, die BlockingQueue implementieren
Da BlockingQueue
es sich um eine Schnittstelle handelt, können wir deren direkte Implementierung nicht bereitstellen.
Um die Funktionalität von nutzen zu können BlockingQueue
, müssen Klassen verwendet werden, die sie implementieren.
- ArrayBlockingQueue
- LinkedBlockingQueue
Wie verwende ich blockierende Warteschlangen?
Wir müssen das java.util.concurrent.BlockingQueue
Paket importieren , um es verwenden zu können BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Hier haben wir Objekte animal1 und animal2 von Klassen erstellt ArrayBlockingQueue
und LinkedBlockingQueue
sind. Diese Objekte können die Funktionen der BlockingQueue
Schnittstelle nutzen.
Methoden zum Blockieren von Queue
Je nachdem, ob eine Warteschlange voll oder leer ist, können Methoden einer blockierenden Warteschlange in drei Kategorien unterteilt werden:
Methoden, die eine Ausnahme auslösen
add()
- Fügt ein Element in die blockierende Warteschlange am Ende der Warteschlange ein. Löst eine Ausnahme aus, wenn die Warteschlange voll ist.element()
- Gibt den Kopf der Sperrwarteschlange 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 Wert zurückgeben
offer()
- Fügt das angegebene Element in die Blockierungswarteschlange am Ende der Warteschlange ein. Gibt zurück,false
wenn die Warteschlange voll ist.peek()
- Gibt den Kopf der Sperrwarteschlange zurück. Gibt zurück,null
wenn die Warteschlange leer ist.poll()
- Entfernt ein Element aus der Sperrwarteschlange. Gibt zurück,null
wenn die Warteschlange leer ist.
Mehr im Angebot () und Umfrage ()
Die Methode offer()
und poll()
kann mit Zeitüberschreitungen verwendet werden. Das heißt, wir können Zeiteinheiten als Parameter übergeben. Beispielsweise,
offer(value, 100, milliseconds)
Hier,
- value ist das Element, das in die Warteschlange eingefügt werden soll
- Und wir haben eine Zeitüberschreitung von 100 Millisekunden festgelegt
Dies bedeutet, dass die offer()
Methode versucht, ein Element für 100
Millisekunden in die Blockierungswarteschlange einzufügen . Wenn das Element nicht in 100 Millisekunden eingefügt werden kann, gibt die Methode zurück false
.
Hinweis: Anstatt milliseconds
wir auch diese Zeiteinheiten verwenden können: days
, hours
, minutes
, seconds
, microseconds
und nanoseconds
in offer()
und poll()
Methoden.
Methoden, die die Operation blockieren
Das BlockingQueue
bietet auch Methoden, um die Operationen zu blockieren und zu warten, ob die Warteschlange voll oder leer ist.
put()
- Fügt ein Element in die Blockierungswarteschlange ein. Wenn die Warteschlange voll ist, wird gewartet, bis in der Warteschlange Platz zum Einfügen eines Elements vorhanden ist.take()
- Entfernt ein Element und gibt es aus der Blockierungswarteschlange zurück. Wenn die Warteschlange leer ist, wartet sie, bis die Warteschlange Elemente enthält, die gelöscht werden sollen.
Angenommen, wir möchten Elemente in eine Warteschlange einfügen. Wenn die Warteschlange voll ist put()
, wartet die Methode, bis in der Warteschlange Platz zum Einfügen von Elementen vorhanden ist.
Ebenso, wenn wir Elemente aus einer Warteschlange löschen möchten. Wenn die Warteschlange leer ist take()
, wartet die Methode, 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 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) Entferntes Element: 2
Weitere ArrayBlockingQueue
Informationen finden Sie unter Java ArrayBlockingQueue.
Warum BlockingQueue?
Wird in Java BlockingQueue
als threadsichere Sammlung betrachtet. Dies liegt daran, dass dies bei Multithreading-Vorgängen hilfreich sein kann.
Angenommen, ein Thread fügt Elemente in die Warteschlange ein und ein anderer Thread entfernt Elemente aus der Warteschlange.
Wenn der erste Thread langsamer ausgeführt wird, kann der zweite Thread durch die Blockierungswarteschlange warten, bis der erste Thread seinen Vorgang abgeschlossen hat.