Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Java

Java LinkedBlockingQueue meistern: Umfassender Leitfaden & Beispiele

Java LinkedBlockingQueue

Erkunden Sie die LinkedBlockingQueue-Klasse, ihre Kernmethoden und reale Beispiele für thread-sicheres Queueing in Java.

Die LinkedBlockingQueue-Klasse, Teil von Javas java.util.concurrent-Paket, implementiert eine blockierende Queue, die von einer verketteten Liste unterstützt wird. Sie entspricht dem BlockingQueue-Interface und bietet eine robuste, thread-sichere Struktur für konkurrierende Producer-Consumer-Szenarien.

Java LinkedBlockingQueue meistern: Umfassender Leitfaden & Beispiele


LinkedBlockingQueue erstellen

Um diese Queue zu nutzen, importieren Sie java.util.concurrent.LinkedBlockingQueue:

import java.util.concurrent.LinkedBlockingQueue;

1. Ohne initiale Kapazität

LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>();

Die Standardkapazität beträgt Integer.MAX_VALUE (231–1), was die Queue effektiv ungebunden macht.

2. Mit angegebener Kapazität

LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>(int capacity);

Beispiel:

// String-Queue mit Kapazität 5 LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5); // Integer-Queue mit Kapazität 5 LinkedBlockingQueue<Integer> ages = new LinkedBlockingQueue<>(5);

Hinweis: Kapazität ist optional; weglassen erstellt ungebundene Queue.


Wichtige Methoden von LinkedBlockingQueue

Die Klasse implementiert alle BlockingQueue-Methoden für Einfügen, Abrufen und Entfernen. Zwei Methoden – put() und take() – bieten blockierendes Verhalten, das diese Queue von Standard-Queues unterscheidet.

Elemente einfügen

Beispiel:

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

Ausgabe

LinkedBlockingQueue: [Dog, Cat, Horse]

Auf Elemente zugreifen

Beispiel:

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("Accessed Element: " + head); Iterator<String> it = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while (it.hasNext()) { System.out.print(it.next() + ", "); } } }

Ausgabe

LinkedBlockingQueue: [Dog, Cat, Horse] Accessed Element: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse, 

Elemente entfernen

Beispiel:

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("Using remove(): " + removed); String polled = animals.poll(); System.out.println("Using poll(): " + polled); animals.clear(); System.out.println("Updated LinkedBlockingQueue: " + animals); } }

Ausgabe

LinkedBlockingQueue: [Dog, Cat, Horse] Using remove(): Dog Using poll(): Cat Updated LinkedBlockingQueue: []

Blockierende Operationen: put() & take()

In konkurrierenden Kontexten blockieren put() und take() den aufrufenden Thread, bis die Operation fortfahren kann, und gewährleisten so sichere Koordination zwischen Producer und Consumer.

put()

Fügt Element am Ende ein, wartet falls Queue voll.

Beispiel:

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

Ausgabe

LinkedBlockingQueue: [Dog, Cat]

take()

Ruft Head-Element ab und entfernt es, blockiert falls Queue leer.

Beispiel:

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("Removed Element: " + removed); System.out.println("New LinkedBlockingQueue: " + animals); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.err.println(e.getMessage()); } } }

Ausgabe

LinkedBlockingQueue: [Dog, Cat] Removed Element: Dog New LinkedBlockingQueue: [Cat]

Zusätzliche Hilfsmethoden

MethodeBeschreibung
contains(Object o)Prüft ob Queue angegebenes Element hält.
size()Gibt aktuelle Anzahl Elemente zurück.
toArray()Konvertiert Queue in Array.
toString()Liefert String-Darstellung der Queue.

Warum LinkedBlockingQueue wählen?

Da es intern eine verkettete Liste nutzt, bietet LinkedBlockingQueue:

In multithreaded Anwendungen, wo ein Thread langsamer produziert als ein anderer konsumiert, suspendiert die Queue den Consumer automatisch bis neue Items eintreffen, verhindert Busy-Waiting und reduziert CPU-Overhead.

Für hochperformante Nebenläufigkeits-Workloads empfiehlt die Java Concurrency API LinkedBlockingQueue als Go-to-Struktur für Producer-Consumer-Pipelines.

---

Java

  1. Java Operatoren meistern: Typen, Syntax und praktische Beispiele
  2. Java Kommentare: Typen, Verwendung und Best Practices
  3. Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
  4. Java Strings meistern: Erstellung, Methoden und Best Practices
  5. Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
  6. Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
  7. Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
  8. Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
  9. Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität
  10. Java Vector verstehen: Verwendung, Funktionen und Vergleich mit ArrayList