Java ArrayBlockingQueue: Fortgeschrittener Leitfaden zu blockierenden Queues und thread-sicheren Operationen
Java ArrayBlockingQueue
Erkunden Sie Java ArrayBlockingQueue – lernen Sie, wie Sie diese festgrößen blockierende Queue erstellen, manipulieren und thread-sicher nutzen mit klaren Beispielen.
Die ArrayBlockingQueue-Klasse im Java Collections Framework bietet eine begrenzte, thread-sichere Queue, die von einem Array unterstützt wird. Sie implementiert das BlockingQueue-Interface, was Producer und Consumer ermöglicht, über blockierende Operationen zu koordinieren.

ArrayBlockingQueue erstellen
Importieren Sie java.util.concurrent.ArrayBlockingQueue und instanziieren Sie mit fester Kapazität:
ArrayBlockingQueue<Type> queue = new ArrayBlockingQueue<>(capacity);
Wobei Type der Elementtyp und capacity die maximale Größe ist.
- Beispiel – String-Queue Größe 5:
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); - Beispiel – Integer-Queue Größe 5:
ArrayBlockingQueue<Integer> ages = new ArrayBlockingQueue<>(5);
Hinweis: Kapazität ist obligatorisch; sie bestimmt die begrenzte Größe der Queue.
Kernmethoden von ArrayBlockingQueue
Die Klasse implementiert alle Methoden von BlockingQueue zum Einfügen, Abrufen und Entfernen von Elementen. Im Folgenden die häufigsten Operationen.
Elemente einfügen
add(E e)– Fügt Element hinzu; wirftIllegalStateExceptionfalls voll.offer(E e)– Fügt Element hinzu; gibtfalsezurück falls voll.
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); animals.add("Dog"); animals.offer("Cat"); animals.offer("Horse"); System.out.println("ArrayBlockingQueue: " + animals);
Ausgabe: ArrayBlockingQueue: [Dog, Cat, Horse]
Auf Elemente zugreifen
peek()– Ruft Head ohne Entfernung ab; gibtnullzurück falls leer.iterator()– Liefert fail-fast Iterator über die Queue.
String head = animals.peek(); System.out.println("Head element: " + head); Iterator<String> it = animals.iterator(); while (it.hasNext()) { System.out.print(it.next() + ", "); }
Ausgabe: Head element: Dog gefolgt von der Liste der Elemente.
Elemente entfernen
remove()– Entfernt und gibt Head zurück; wirftNoSuchElementExceptionfalls leer.poll()– Entfernt und gibt Head zurück; gibtnullzurück falls leer.clear()– Leert die Queue.
String removed1 = animals.remove(); String removed2 = animals.poll(); animals.clear(); System.out.println("Updated queue: " + animals);
Ausgabe: Updated queue: []
Blockierende Operationen: put() und take()
Diese Methoden sind essenziell für Producer-Consumer-Muster. Sie blockieren, bis die Operation durchgeführt werden kann, und gewährleisten Thread-Koordination.
put()
Fügt Element ein, wartet falls Queue voll. Kann InterruptedException werfen.
try { animals.put("Dog"); animals.put("Cat"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
take()
Entfernt und gibt Head zurück, wartet falls Queue leer. Kann InterruptedException werfen.
try { String element = animals.take(); System.out.println("Removed: " + element); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
Zusätzliche Komfort-Methoden
| Methode | Beschreibung |
|---|---|
contains(Object o) | Gibt true zurück falls Queue angegebenes Element enthält. |
size() | Gibt aktuelle Anzahl Elemente zurück. |
toArray() | Konvertiert Queue in Array. |
toString() | String-Darstellung der Queue. |
Warum ArrayBlockingQueue verwenden?
Weil es bietet:
- Thread-Sicherheit: Eingebaute Synchronisation für konkurrierenden Zugriff.
- Feste Größe: Verhindert unkontrolliertes Speicherwachstum.
- Blocking-Semantik: Vereinfacht Producer-Consumer-Koordination.
Wenn ein Thread langsamer produziert als der Consumer konsumiert, blockiert der Consumer automatisch, vermeidet Busy-Waiting und sorgt für effiziente CPU-Nutzung.
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität
- Java Vector verstehen: Verwendung, Funktionen und Vergleich mit ArrayList