Java BlockingQueue-Schnittstelle

In diesem Tutorial lernen wir die Java BlockingQueue-Schnittstelle und ihre Methoden kennen.

Die BlockingQueueSchnittstelle des Java- CollectionsFrameworks erweitert die QueueSchnittstelle. 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 BlockingQueuees 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.BlockingQueuePaket 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 ArrayBlockingQueueund LinkedBlockingQueuesind. Diese Objekte können die Funktionen der BlockingQueueSchnittstelle 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, falsewenn die Warteschlange voll ist.
  • peek()- Gibt den Kopf der Sperrwarteschlange zurück. Gibt zurück, nullwenn die Warteschlange leer ist.
  • poll()- Entfernt ein Element aus der Sperrwarteschlange. Gibt zurück, nullwenn 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 100Millisekunden in die Blockierungswarteschlange einzufügen . Wenn das Element nicht in 100 Millisekunden eingefügt werden kann, gibt die Methode zurück false.

Hinweis: Anstatt millisecondswir auch diese Zeiteinheiten verwenden können: days, hours, minutes, seconds, microsecondsund nanosecondsin offer()und poll()Methoden.

Methoden, die die Operation blockieren

Das BlockingQueuebietet 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 ArrayBlockingQueueInformationen finden Sie unter Java ArrayBlockingQueue.

Warum BlockingQueue?

Wird in Java BlockingQueueals 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.

Interessante Beiträge...