Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

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.

Java LinkedBlockingQueue beheersen: Uitgebreide handleiding & voorbeelden


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, retourneert false als 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; retourneert null als leeg.
  • iterator() – Biedt een fail-safe iterator over de wachtrij. Importeer java.util.Iterator om 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; retourneert null als 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

MethodeBeschrijving
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

  1. Java-operators beheersen: typen, syntax en praktische voorbeelden
  2. Java-commentaar: typen, gebruik en best practices
  3. Java if…else beheersen: control flow uitgelegd
  4. Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
  5. Java Strings beheersen: aanmaken, methodes en best practices
  6. Java interfaces meesteren: concepten, implementatie en best practices
  7. Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
  8. Java Try-with-resources meesteren: automatische resource management uitgelegd
  9. Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
  10. Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
  11. Java Vector begrijpen: Gebruik, Kenmerken en Vergelijking met ArrayList