English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In diesem Tutorial werden wir das Java BlockingQueue-Interface und seine Methoden lernen.
Das Java Collections Framework erweitert das Queue-Interface durch das BlockingQueue-Interface. Es ermöglicht jede Operation zu warten, bis sie erfolgreich ausgeführt wird.
Beispielsweise ermöglicht die Blockierungskette das Löschen aus einer leeren Kette, indem das Löschen wartet, bis einige zu löschende Elemente in der Kette vorhanden sind.
Da BlockingQueue ein Interface ist, können wir keine direkte Implementierung davon liefern.
Um die Funktionen von BlockingQueue zu verwenden, müssen wir die Klassen verwenden, die es implementieren.
Um BlockingQueue verwenden zu können, müssen wir das Paket java.util.concurrent.BlockingQueue importieren.
//Array-Implementierung der BlockingQueue BlockingQueue<String> animal1 = new ArraryBlockingQueue<>(); //LinkedList-Implementierung der BlockingQueue BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Hier haben wir die Objekte der Klassen ArrayBlockingQueue und LinkedBlockingQueue für animal erstellt1und animal2. Diese Objekte können die Funktionen von BlockingQueue-Interface verwenden.
Je nach dem, ob die Kette voll oder leer ist, können die Methoden der Blockierungskette in3Klasse:
add() - Fügt das Element an das Ende der Blockierungskette ein. Wenn die Kette voll ist, wird eine Ausnahme ausgelöst.
element() - Gibt den Kopf der Blockierungskette zurück. Wenn die Kette leer ist, wird eine Ausnahme ausgelöst.
remove() -Ein Element aus der Blockierungskette entfernen. Wenn die Kette leer ist, wird eine Ausnahme ausgelöst.
offer() - Fügt das angegebene Element an das Ende der Blockierungskette ein. Wenn die Kette voll ist, wird false zurückgegeben.
peek() - Gibt den Kopf der Blockierungskette zurück. Wenn die Kette leer ist, wird null zurückgegeben.
poll() - Ein Element aus der Blockierungskette entfernen. Wenn die Kette leer ist, wird null zurückgegeben.
offer() und poll()Mehr Informationen
offer() und poll() können mit Zeitüberschreitung verwendet werden. Das bedeutet, dass wir Zeitединицы als Parameter übergeben können. Zum Beispiel,
offer(value, 100, milliseconds)
Hier,
value ist das Element, das in die Warteschlange eingefügt werden soll
und wir setzen die Zeitüberschreitung auf100 Millisekunden
Das bedeutet, dass das offer()-Verfahren versucht, ein Element in die Blockierende Warteschlange einzufügen, für eine Dauer von100 Millisekunden. Wenn10Es ist nicht möglich, innerhalb von 0 Millisekunden ein Element einzufügen, die Methode gibt false zurück.
Anmerkung:Abgesehen von Millisekunden können wir auch die folgenden Zeitединицы in den Methoden offer() und poll() verwenden: Tage, Stunden, Minuten, Sekunden, Mikrosekunden und Nanosekunden.
BlockingQueue bietet auch einige Methoden, um blockierende Operationen und Warten zu ermöglichen, wenn die Warteschlange voll oder leer ist.
put() - Ein Element in die Blockierende Warteschlange einfügen. Wenn die Warteschlange voll ist, wird sie warten, bis Platz in der Warteschlange vorhanden ist.
take() - Ein Element aus der Blockierenden Warteschlange entfernen und zurückgeben. Wenn die Warteschlange leer ist, wird sie warten, bis ein zu löschendes Element in der Warteschlange vorhanden ist.
Angenommen, wir möchten ein Element in die Warteschlange einfügen. Wenn die Warteschlange voll ist, wird die put()-Methode warten, bis Platz in der Warteschlange vorhanden ist, um das Element einzufügen.
Gleichzeitig, wenn wir ein Element aus der Warteschlange löschen möchten. Wenn die Warteschlange leer ist, wird die take()-Methode warten, bis die Warteschlange das zu löschende Element enthält.
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { //Eine Blockierende Warteschlange mit ArrayBlockingQueue erstellen BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5); try { //Ein Element in die Blockierende Warteschlange einfügen numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); //Ein Element aus der Blockierenden Warteschlange entfernen int removedNumber = numbers.take(); System.out.println("Gelöschte Nummer: ") + removedNumber); } catch(Exception e) { e.getStackTrace(); } } }
Ausgabenergebnis
BlockingQueue: [2, 1, 3] Gelöschtes Element: 2
Für weitere Informationen über ArrayBlockingQueue besuchen Sie bitteJava ArrayBlockingQueue.
In Java wird BlockingQueue alsThread-sicherKollektion. Dies liegt daran, dass es in Multithreading-Operationen helfen kann.
Angenommen, ein Thread fügt Elemente in die Warteschlange ein, während ein anderer Thread Elemente aus der Warteschlange löscht.
Jetzt, wenn die Geschwindigkeit der ersten Thread langsamer ist, kann die BlockingQueue den zweiten Thread blockieren, bis die erste Thread ihre Operation beendet hat.