Java LinkedBlockingQueue

In deze tutorial zullen we met behulp van voorbeelden leren over de LinkedBLockingQueue-klasse en zijn methoden.

De LinkedBlockingQueueklasse van het Java- Collectionsframework biedt de implementatie van de blokkerende wachtrij met behulp van een gekoppelde lijst.

Het implementeert de Java BlockingQueue-interface.

LinkedBlockingQueue maken

Om een ​​gekoppelde blokkeerwachtrij te maken, moeten we het java.util.concurrent.LinkedBlockingQueuepakket importeren .

Hier is hoe we een gekoppelde blokkeerwachtrij in Java kunnen maken:

1. Zonder de initiële capaciteit

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Hier is de standaard initiële capaciteit 2 31 -1.

2. Met de initiële capaciteit

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Hier,

  • Type - het type van de gekoppelde blokkeerwachtrij
  • capaciteit - de grootte van de gekoppelde blokkeerwachtrij

Bijvoorbeeld,

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

Opmerking: het is niet verplicht om de grootte van de gekoppelde lijst op te geven.

Methoden van LinkedBlockingQueue

De LinkedBlockingQueueklasse biedt de implementatie van alle methoden in de BlockingQueue-interface.

Deze methoden worden gebruikt om elementen in gekoppelde blokkeerwachtrijen in te voegen, te openen en te verwijderen.

Ook zullen we leren over twee methoden put()en take()dat de steun van de blokkerende werking in de gekoppelde blokkerende wachtrij.

Deze twee methoden onderscheiden de gekoppelde blokkeerwachtrij van andere typische wachtrijen.

Elementen invoegen

  • add()- Voegt een gespecificeerd element toe aan de gekoppelde blokkeerwachtrij. Het genereert een uitzondering als de wachtrij vol is.
  • offer()- Voegt een gespecificeerd element toe aan de gekoppelde blokkeerwachtrij. Het keert terug falseals de wachtrij vol is.

Bijvoorbeeld,

 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); ) ) 

Uitvoer

 LinkedBlockingQueue: (hond, kat, paard) 

Toegang tot elementen

  • peek()- Retourneert een element van de voorkant van de gekoppelde blokkeerwachtrij. Het keert terug nullals de wachtrij leeg is.
  • iterator()- Retourneert een iteratorobject om opeenvolgend toegang te krijgen tot een element uit de gekoppelde blokkeerwachtrij. Het genereert een uitzondering als de wachtrij leeg is. We moeten het java.util.Iteratorpakket importeren om het te kunnen gebruiken.

Bijvoorbeeld,

 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(", "); ) ) ) 

Uitvoer

 LinkedBlockingQueue: (Dog, Cat, Horse) Betreden element: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse, 

Elementen verwijderen

  • remove()- Retourneert en verwijdert een gespecificeerd element uit de gekoppelde blokkeerwachtrij. Het genereert een uitzondering als de wachtrij leeg is.
  • poll()- Retourneert en verwijdert een gespecificeerd element uit de gekoppelde blokkeerwachtrij. Het keert terug nullals de wachtrij leeg is.
  • clear() - Verwijdert alle elementen uit de gekoppelde blokkeerwachtrij.

Bijvoorbeeld,

 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); ) ) 

Uitvoer

 LinkedBlockingQueue: (Hond, Kat, Paard) Verwijderde Elementen: Met remove (): Hond Met poll (): Kat Bijgewerkt LinkedBlockingQueue: () 

put () en take () methoden

In multithreading-processen kunnen we put()en take()gebruiken om de werking van een thread te blokkeren om deze te synchroniseren met een andere thread. Deze methoden wachten totdat ze met succes kunnen worden uitgevoerd.

put () methode

Om het opgegeven element aan het einde van een gekoppelde blokkeerwachtrij in te voegen, gebruiken we de put()methode.

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) Zoekt in de gekoppelde blokkeerwachtrij naar het opgegeven element. Als het element wordt gevonden, keert het terug true, zo niet, dan keert het terug false.
size() Retourneert de lengte van de gekoppelde blokkeerwachtrij.
toArray() Converteert een gekoppelde blokkeerwachtrij naar een array en retourneert de array.
toString() Converteert de gekoppelde blokkeerwachtrij naar een string

Waarom LinkedBlockingQueue gebruiken?

Het LinkedBlockingQueuegebruikt gekoppelde lijsten als interne opslag.

Het wordt beschouwd als een draadveilige verzameling. Daarom wordt het over het algemeen gebruikt in toepassingen met meerdere threads.

Stel dat een thread elementen in de wachtrij invoegt en een andere thread elementen uit de wachtrij verwijdert.

Als de eerste thread nu langzamer is dan de tweede thread, kan de gekoppelde blokkeerwachtrij de tweede thread laten wachten totdat de eerste thread zijn bewerkingen heeft voltooid.

Interessante artikelen...