In deze tutorial zullen we met behulp van voorbeelden leren over de LinkedBLockingQueue-klasse en zijn methoden.
De LinkedBlockingQueue
klasse van het Java- Collections
framework 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.LinkedBlockingQueue
pakket 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 LinkedBlockingQueue
klasse 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 terugfalse
als 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 terugnull
als 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 hetjava.util.Iterator
pakket 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 terugnull
als 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 LinkedBlockingQueue
gebruikt 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.