Java LinkedBlockingQueue

In diesem Tutorial lernen wir anhand von Beispielen die LinkedBLockingQueue-Klasse und ihre Methoden kennen.

Die LinkedBlockingQueueKlasse des Java- CollectionsFrameworks stellt die Implementierung der Blockierungswarteschlange mithilfe einer verknüpften Liste bereit.

Es implementiert die Java BlockingQueue-Schnittstelle.

LinkedBlockingQueue erstellen

Um eine verknüpfte Blockierungswarteschlange zu erstellen, müssen wir das java.util.concurrent.LinkedBlockingQueuePaket importieren .

So können wir eine verknüpfte Blockierungswarteschlange in Java erstellen:

1. Ohne die anfängliche Kapazität

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Hier beträgt die anfängliche Standardkapazität 2 31 -1.

2. Mit der anfänglichen Kapazität

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Hier,

  • Typ - Der Typ der verknüpften Blockierungswarteschlange
  • Kapazität - Die Größe der verknüpften Blockierungswarteschlange

Beispielsweise,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Hinweis: Die Größe der verknüpften Liste muss nicht angegeben werden.

Methoden von LinkedBlockingQueue

Die LinkedBlockingQueueKlasse bietet die Implementierung aller Methoden in der BlockingQueue-Schnittstelle.

Diese Methoden werden verwendet, um Elemente in verknüpfte Blockierungswarteschlangen einzufügen, darauf zuzugreifen und sie zu löschen.

Außerdem werden wir über zwei Methoden lernen put()und take()dass die Unterstützung des Sperrbetrieb in der verknüpften blockiert Warteschlange.

Diese beiden Methoden unterscheiden die verknüpfte Blockierungswarteschlange von anderen typischen Warteschlangen.

Elemente einfügen

  • add()- Fügt ein angegebenes Element in die verknüpfte Blockierungswarteschlange ein. Es wird eine Ausnahme ausgelöst, wenn die Warteschlange voll ist.
  • offer()- Fügt ein angegebenes Element in die verknüpfte Blockierungswarteschlange ein. Es wird zurückgegeben, falsewenn die Warteschlange voll ist.

Beispielsweise,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Ausgabe

 LinkedBlockingQueue: (Hund, Katze, Pferd) 

Zugriffselemente

  • peek()- Gibt ein Element von der Vorderseite der verknüpften Blockierungswarteschlange zurück. Es wird zurückgegeben, nullwenn die Warteschlange leer ist.
  • iterator()- Gibt ein Iteratorobjekt zurück, um nacheinander auf ein Element aus der verknüpften Blockierungswarteschlange zuzugreifen. Es wird eine Ausnahme ausgelöst, wenn die Warteschlange leer ist. Wir müssen das java.util.IteratorPaket importieren , um es zu verwenden.

Beispielsweise,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Ausgabe

 LinkedBlockingQueue: (Hund, Katze, Pferd) Zugriffselement: Hund LinkedBlockingQueue Elemente: Hund, Katze, Pferd, 

Elemente entfernen

  • remove() - Returns and removes a specified element from the linked blocking queue. It throws an exception if the queue is empty.
  • poll() - Returns and removes a specified element from the linked blocking queue. It returns null if the queue is empty.
  • clear() - Removes all the elements from the linked blocking queue.

For example,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated LinkedBlockingQueue " + animals); ) ) 

Output

 LinkedBlockingQueue: (Dog, Cat, Horse) Removed Elements: Using remove(): Dog Using poll(): Cat Updated LinkedBlockingQueue: () 

put() and take() Methods

In multithreading processes, we can use put() and take() to block the operation of one thread to synchronize it with another thread. These methods will wait until they can be successfully executed.

put() Method

To insert the specified element to the end of a linked blocking queue, we use the put() method.

If the linked blocking queue is full, it waits until there is space in the linked blocking queue to insert the element.

For example,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Output

 LinkedBlockingQueue: (Dog, Cat) 

Here, the put() method may throw an InterruptedException if it is interrupted while waiting. Hence, we must enclose it inside a try… catch block.

take() Method

To return and remove an element from the front of the linked blocking queue, we can use the take() method.

If the linked blocking queue is empty, it waits until there are elements in the linked blocking queue to be deleted.

For example,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Output

 LinkedBlockingQueue: (Dog, Cat) Removed Element: Dog New LinkedBlockingQueue: (Cat) 

Here, the take() method will throw an InterrupedException if it is interrupted while waiting. Hence, we must enclose it inside a try… catch block.

Other Methods

Methods Descriptions
contains(element) Durchsucht die verknüpfte Blockierungswarteschlange nach dem angegebenen Element. Wenn das Element gefunden wird, wird es zurückgegeben true, wenn nicht, wird es zurückgegeben false.
size() Gibt die Länge der verknüpften Blockierungswarteschlange zurück.
toArray() Konvertiert die verknüpfte Blockierungswarteschlange in ein Array und gibt das Array zurück.
toString() Konvertiert die verknüpfte Blockierungswarteschlange in eine Zeichenfolge

Warum LinkedBlockingQueue verwenden?

Der LinkedBlockingQueueverwendet verknüpfte Listen als internen Speicher.

Es wird als thread-sichere Sammlung betrachtet. Daher wird es im Allgemeinen in Multithreading-Anwendungen verwendet.

Angenommen, ein Thread fügt Elemente in die Warteschlange ein und ein anderer Thread entfernt Elemente aus der Warteschlange.

Wenn der erste Thread langsamer als der zweite Thread ist, kann die verknüpfte Blockierungswarteschlange den zweiten Thread warten lassen, bis der erste Thread seine Operationen abgeschlossen hat.

Interessante Beiträge...