Java LinkedBlockingQueue beheersen: Uitgebreide handleiding & voorbeelden
Java LinkedBlockingQueue
Verken de LinkedBlockingQueue-klasse, de kernmethoden en real-world voorbeelden om thread-veilige wachtrij-operaties in Java te ontgrendelen.
De LinkedBlockingQueue-klasse, onderdeel van Java's java.util.concurrent-pakket, implementeert een blokkerende wachtrij ondersteund door een linked list. Het voldoet aan de BlockingQueue-interface, wat een robuuste, thread-veilige structuur biedt voor concurrente producer-consumer scenario's.

Een LinkedBlockingQueue aanmaken
Om deze wachtrij te gebruiken, importeer java.util.concurrent.LinkedBlockingQueue:
import java.util.concurrent.LinkedBlockingQueue;
1. Zonder initiële capaciteit
LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>();
De standaardcapaciteit is Integer.MAX_VALUE (231–1), wat de wachtrij effectief onbegrensd maakt.
2. Met gespecificeerde capaciteit
LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>(int capacity);
Type– het elementtype (bijv.String,Integer)capacity– maximum aantal elementen dat de wachtrij kan bevatten
Voorbeeld:
// String-wachtrij met capaciteit 5 LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); // Integer-wachtrij met capaciteit 5 LinkedBlockingQueue<Integer> ages = new LinkedBlockingQueue<>(5);
Let op: Capaciteit is optioneel; weglaten creëert een onbegrensde wachtrij.
Belangrijkste methoden van LinkedBlockingQueue
De klasse implementeert alle BlockingQueue-methoden, wat invoegen, ophalen en verwijderen van elementen mogelijk maakt. Twee methoden – put() en take() – bieden blokkerend gedrag dat deze wachtrij onderscheidt van standaard wachtrijen.
Elementen invoegen
add(E e)– Voegt een element toe, gooit exception als wachtrij vol is.offer(E e)– Voegt een element toe, retourneertfalseals wachtrij vol is.
Voorbeeld:
import java.util.concurrent.LinkedBlockingQueue; public class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); animals.add("Dog"); animals.add("Cat"); animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); } }
Output
LinkedBlockingQueue: [Dog, Cat, Horse]
Elementen benaderen
peek()– Haalt de head op zonder verwijdering; retourneertnullals leeg.iterator()– Biedt een fail-safe iterator over de wachtrij. Importeerjava.util.Iteratorom te gebruiken.
Voorbeeld:
import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; public class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); String head = animals.peek(); System.out.println("Toegankelijk element: " + head); Iterator<String> it = animals.iterator(); System.out.print("LinkedBlockingQueue Elementen: "); while (it.hasNext()) { System.out.print(it.next() + ", "); } } }
Output
LinkedBlockingQueue: [Dog, Cat, Horse] Toegankelijk element: Dog LinkedBlockingQueue Elementen: Dog, Cat, Horse,
Elementen verwijderen
remove()– Verwijdert en retourneert de head; gooit exception als leeg.poll()– Verwijdert en retourneert de head; retourneertnullals leeg.clear()– Verwijdert alle elementen.
Voorbeeld:
import java.util.concurrent.LinkedBlockingQueue; public class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); String removed = animals.remove(); System.out.println("Met remove(): " + removed); String polled = animals.poll(); System.out.println("Met poll(): " + polled); animals.clear(); System.out.println("Bijgewerkte LinkedBlockingQueue: " + animals); } }
Output
LinkedBlockingQueue: [Dog, Cat, Horse] Met remove(): Dog Met poll(): Cat Bijgewerkte LinkedBlockingQueue: []
Blokkerende operaties: put() & take()
In concurrente contexten blokkeren put() en take() de aanroepende thread tot de operatie kan voortgaan, wat veilige coördinatie tussen producers en consumers garandeert.
put()
Voegt een element aan de tail toe, wachtend als de wachtrij vol is.
Voorbeeld:
import java.util.concurrent.LinkedBlockingQueue; public class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); try { animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.err.println(e.getMessage()); } } }
Output
LinkedBlockingQueue: [Dog, Cat]
take()
Haalt en verwijdert het head-element, blokkerend als de wachtrij leeg is.
Voorbeeld:
import java.util.concurrent.LinkedBlockingQueue; public class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); try { animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); String removed = animals.take(); System.out.println("Verwijderd element: " + removed); System.out.println("Nieuwe LinkedBlockingQueue: " + animals); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.err.println(e.getMessage()); } } }
Output
LinkedBlockingQueue: [Dog, Cat] Verwijderd element: Dog Nieuwe LinkedBlockingQueue: [Cat]
Aanvullende utility-methoden
| Methode | Beschrijving |
|---|---|
contains(Object o) | Controleert of de wachtrij het opgegeven element bevat. |
size() | Retourneert het huidige aantal elementen. |
toArray() | Converteert de wachtrij naar een array. |
toString() | Geeft een string-representatie van de wachtrij. |
Waarom LinkedBlockingQueue kiezen?
Omdat het intern een linked list gebruikt, biedt LinkedBlockingQueue:
- Thread-veiligheid out-of-the-box.
- Optionele begrensde capaciteit voor back-pressure controle.
- Blokkerende methoden die producers en consumers natuurlijk coördineren.
In multithreaded applicaties waar één thread langzamer produceert dan een andere consumeert, zal de wachtrij de consumer automatisch opschorten tot nieuwe items arriveren, wat busy-waiting voorkomt en CPU-overhead reduceert.
Voor high-performance concurrente workloads adviseert de Java concurrency API LinkedBlockingQueue als go-to structuur voor producer-consumer pipelines.
---
Java
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java-commentaar: typen, gebruik en best practices
- Java if…else beheersen: control flow uitgelegd
- Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
- Java Strings beheersen: aanmaken, methodes en best practices
- Java interfaces meesteren: concepten, implementatie en best practices
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
- Java Vector begrijpen: Gebruik, Kenmerken en Vergelijking met ArrayList