Java ArrayBlockingQueue: Geavanceerde handleiding voor blokkerende wachtrijen en thread-veilige operaties
Java ArrayBlockingQueue
Verken de Java ArrayBlockingQueue – leer hoe je deze fixed-size blokkerende wachtrij thread-veilig kunt aanmaken, manipuleren en gebruiken met duidelijke voorbeelden.
De ArrayBlockingQueue-klasse in het Java Collections Framework biedt een begrensde, thread-veilige wachtrij ondersteund door een array. Het implementeert de BlockingQueue-interface, waardoor producers en consumers kunnen coördineren via blokkerende operaties.

Een ArrayBlockingQueue aanmaken
Importeer java.util.concurrent.ArrayBlockingQueue en instantieer met een vaste capaciteit:
ArrayBlockingQueue<Type> queue = new ArrayBlockingQueue<>(capacity);
Waar Type het elementtype is en capacity de maximale grootte.
- Voorbeeld – String-wachtrij van grootte 5:
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); - Voorbeeld – Integer-wachtrij van grootte 5:
ArrayBlockingQueue<Integer> ages = new ArrayBlockingQueue<>(5);
Let op: Capaciteit is verplicht; het bepaalt de begrensde grootte van de wachtrij.
Kernmethoden van ArrayBlockingQueue
De klasse implementeert alle methoden van BlockingQueue voor invoegen, benaderen en verwijderen van elementen. Hieronder de meest gebruikte operaties.
Elementen invoegen
add(E e)– Voegt het element toe; gooitIllegalStateExceptionals vol.offer(E e)– Voegt het element toe; retourneertfalseals vol.
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); animals.add("Dog"); animals.offer("Cat"); animals.offer("Horse"); System.out.println("ArrayBlockingQueue: " + animals);
Output: ArrayBlockingQueue: [Dog, Cat, Horse]
Elementen benaderen
peek()– Haalt de head op zonder verwijdering; retourneertnullals leeg.iterator()– Biedt een fail-fast iterator over de wachtrij.
String head = animals.peek(); System.out.println("Head element: " + head); Iterator<String> it = animals.iterator(); while (it.hasNext()) { System.out.print(it.next() + ", "); }
Output: Head element: Dog gevolgd door de lijst van elementen.
Elementen verwijderen
remove()– Verwijdert en retourneert de head; gooitNoSuchElementExceptionals leeg.poll()– Verwijdert en retourneert de head; retourneertnullals leeg.clear()– Leegt de wachtrij.
String removed1 = animals.remove(); String removed2 = animals.poll(); animals.clear(); System.out.println("Bijgewerkte wachtrij: " + animals);
Output: Bijgewerkte wachtrij: []
Blokkerende operaties: put() en take()
Deze methoden zijn essentieel voor producer-consumer patronen. Ze blokkeren tot de operatie uitgevoerd kan worden, wat thread-coördinatie garandeert.
put()
Voegt een element toe, wachtend als de wachtrij vol is. Kan InterruptedException gooien.
try { animals.put("Dog"); animals.put("Cat"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
take()
Verwijdert en retourneert de head, wachtend als de wachtrij leeg is. Kan InterruptedException gooien.
try { String element = animals.take(); System.out.println("Verwijderd: " + element); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
Aanvullende convenience-methoden
| Methode | Beschrijving |
|---|---|
contains(Object o) | Retourneert true als de wachtrij het opgegeven element bevat. |
size() | Retourneert het huidige aantal elementen. |
toArray() | Converteert de wachtrij naar een array. |
toString() | String-representatie van de wachtrij. |
Waarom ArrayBlockingQueue gebruiken?
Omdat het biedt:
- Thread-veiligheid: Ingebouwde synchronisatie voor gelijktijdige toegang.
- Vaste grootte: Voorkomt onbeheerde geheugengroei.
- Blokkerende semantiek: Vereenvoudigt producer-consumer coördinatie.
Wanneer één thread langzamer produceert dan de consumer, blokkeert de consumer automatisch, wat busy-waiting voorkomt en efficiënt CPU-gebruik waarborgt.
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