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 BlockingQueue: Thread-veilige wachtrijen met blokkerende operaties

Java BlockingQueue

Deze handleiding verkent de Java BlockingQueue-interface, de implementaties, methodecategorieën en real-world gebruik.

De BlockingQueue-interface, onderdeel van het Java Collections framework, extends Queue en verrijkt het met blokkerend gedrag. Operaties zoals invoegen en verwijderen wachten automatisch tot de staat van de wachtrij de actie toestaat.

Bijvoorbeeld, het proberen om een element uit een lege wachtrij te verwijderen blokkeert de aanroepende thread tot een item beschikbaar komt, wat veilige coördinatie tussen producers en consumers garandeert.


Concrete implementaties

Omdat BlockingQueue een interface is, leveren concrete klassen de functionaliteit:

  • ArrayBlockingQueue – een begrensde, array-gebaseerde FIFO-wachtrij.
  • LinkedBlockingQueue – een optioneel begrensde, linked-list implementatie.

Java BlockingQueue: Thread-veilige wachtrijen met blokkerende operaties


BlockingQueue gebruiken

Importeer het pakket voordat je instanties aanmaakt:

import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;

Voorbeeldinstanties:

// Array-implementatie van BlockingQueue BlockingQueue<String> animal1 = new ArrayBlockingQueue<>(10); // LinkedList-implementatie van BlockingQueue BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();

Beide objecten ondersteunen alle methoden gedefinieerd door de BlockingQueue-interface.


Methodecategorieën

BlockingQueue-methoden zijn gegroepeerd op hoe ze reageren wanneer de wachtrij vol of leeg is:

Exception-gooiende methoden

  • add(E e) – voegt een element toe; gooit IllegalStateException als vol.
  • element() – haalt de head op zonder te verwijderen; gooit NoSuchElementException als leeg.
  • remove() – verwijdert de head; gooit NoSuchElementException als leeg.

Return-waarde methoden

  • offer(E e) – voegt een element toe; retourneert false als vol.
  • peek() – haalt de head op; retourneert null als leeg.
  • poll() – verwijdert de head; retourneert null als leeg.

Getimede varianten

Zowel offer als poll ondersteunen time-outs:

boolean success = queue.offer(item, 100, TimeUnit.MILLISECONDS);

In dit voorbeeld probeert de methode item maximaal 100 milliseconden in te voegen, retourneert false als de operatie time-out. Ondersteunde tijdseenheden zijn days, hours, minutes, seconds, milliseconds, microseconds en nanoseconds.

Blokkerende methoden

  • put(E e) – voegt een element toe, blokkeert als de wachtrij vol is tot ruimte beschikbaar komt.
  • take() – verwijdert en retourneert de head, blokkeert als de wachtrij leeg is tot een element wordt ingevoegd.

Deze methoden zijn essentieel voor producer-consumer patronen waar threads zich moeten synchroniseren zonder busy-waiting.


ArrayBlockingQueue-voorbeeld

import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; public class Main { public static void main(String[] args) { // Maak een begrensde blocking queue met capaciteit 5 BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5); try { // Voeg elementen toe – blokkeert als wachtrij vol raakt numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BlockingQueue: " + numbers); // Verwijder een element – blokkeert als wachtrij leeg is int removedNumber = numbers.take(); System.out.println("Verwijderd nummer: " + removedNumber); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.err.println("Operatie onderbroken: " + e.getMessage()); } } }

Output

BlockingQueue: [2, 1, 3] Verwijderd nummer: 2 

Voor diepere inzichten, raadpleeg de officiële Java-documentatie over ArrayBlockingQueue.


Waarom BlockingQueue gebruiken?

Het kernvoordeel van BlockingQueue is de inherente thread-veiligheid. Het elimineert de noodzaak voor expliciete synchronisatie wanneer meerdere threads gelijktijdig data produceren en consumeren.

Overweeg een producer-thread die items langzamer invoegt dan een consumer-thread die ze verwijdert. Zonder blokkerend gedrag zou de consumer exceptions kunnen gooien of in een busy-wait lus draaien. Een BlockingQueue schorst de consumer automatisch tot de producer nieuwe data beschikbaar maakt, en vice versa.

Door deze ingebouwde blokkerende mechanismen te benutten, kunnen ontwikkelaars robuuste, schaalbare concurrente applicaties bouwen met minimale boilerplate.


---

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