In diesem Tutorial lernen wir anhand von Beispielen die LinkedBLockingQueue-Klasse und ihre Methoden kennen.
Die LinkedBlockingQueue
Klasse des Java- Collections
Frameworks 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.LinkedBlockingQueue
Paket 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 LinkedBlockingQueue
Klasse 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,false
wenn 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,null
wenn 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 dasjava.util.Iterator
Paket 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 returnsnull
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 LinkedBlockingQueue
verwendet 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.