English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java Grund教程

Java Flow Control

Java Array

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

Java Ausnahmebehandlung

Java List (List)

Java Queue (Queue)

Java Map Collection

Java Set Collection

Java Eingabe-Ausgabe(I/O)

Java Reader/Writer

Java andere Themen

Java BlockingQueue

In diesem Tutorial werden wir das Java BlockingQueue-Interface und seine Methoden lernen.

Das Java Collections Framework erweitert das Queue-Interface durch das BlockingQueue-Interface. Es ermöglicht jede Operation zu warten, bis sie erfolgreich ausgeführt wird.

Beispielsweise ermöglicht die Blockierungskette das Löschen aus einer leeren Kette, indem das Löschen wartet, bis einige zu löschende Elemente in der Kette vorhanden sind.

Klassen, die BlockingQueue implementieren

Da BlockingQueue ein Interface ist, können wir keine direkte Implementierung davon liefern.

Um die Funktionen von BlockingQueue zu verwenden, müssen wir die Klassen verwenden, die es implementieren.

Wie verwendet man die Blockierungskette?

Um BlockingQueue verwenden zu können, müssen wir das Paket java.util.concurrent.BlockingQueue importieren.

//Array-Implementierung der BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
//LinkedList-Implementierung der BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();

Hier haben wir die Objekte der Klassen ArrayBlockingQueue und LinkedBlockingQueue für animal erstellt1und animal2. Diese Objekte können die Funktionen von BlockingQueue-Interface verwenden.

BlockingQueue-Methode

Je nach dem, ob die Kette voll oder leer ist, können die Methoden der Blockierungskette in3Klasse:

Methode, die eine Ausnahme auslöst

  • add() - Fügt das Element an das Ende der Blockierungskette ein. Wenn die Kette voll ist, wird eine Ausnahme ausgelöst.

  • element() - Gibt den Kopf der Blockierungskette zurück. Wenn die Kette leer ist, wird eine Ausnahme ausgelöst.

  • remove() -Ein Element aus der Blockierungskette entfernen. Wenn die Kette leer ist, wird eine Ausnahme ausgelöst.

Methode zum Rückgabe eines Wertes

  • offer() - Fügt das angegebene Element an das Ende der Blockierungskette ein. Wenn die Kette voll ist, wird false zurückgegeben.

  • peek() - Gibt den Kopf der Blockierungskette zurück. Wenn die Kette leer ist, wird null zurückgegeben.

  • poll() - Ein Element aus der Blockierungskette entfernen. Wenn die Kette leer ist, wird null zurückgegeben.

offer() und poll()Mehr Informationen

offer() und poll() können mit Zeitüberschreitung verwendet werden. Das bedeutet, dass wir Zeitединицы als Parameter übergeben können. Zum Beispiel,

offer(value, 100, milliseconds)

Hier,

  • value ist das Element, das in die Warteschlange eingefügt werden soll

  • und wir setzen die Zeitüberschreitung auf100 Millisekunden

Das bedeutet, dass das offer()-Verfahren versucht, ein Element in die Blockierende Warteschlange einzufügen, für eine Dauer von100 Millisekunden. Wenn10Es ist nicht möglich, innerhalb von 0 Millisekunden ein Element einzufügen, die Methode gibt false zurück.

Anmerkung:Abgesehen von Millisekunden können wir auch die folgenden Zeitединицы in den Methoden offer() und poll() verwenden: Tage, Stunden, Minuten, Sekunden, Mikrosekunden und Nanosekunden.

BlockingQueue-Operationen

BlockingQueue bietet auch einige Methoden, um blockierende Operationen und Warten zu ermöglichen, wenn die Warteschlange voll oder leer ist.

  • put() - Ein Element in die Blockierende Warteschlange einfügen. Wenn die Warteschlange voll ist, wird sie warten, bis Platz in der Warteschlange vorhanden ist.

  • take() - Ein Element aus der Blockierenden Warteschlange entfernen und zurückgeben. Wenn die Warteschlange leer ist, wird sie warten, bis ein zu löschendes Element in der Warteschlange vorhanden ist.

Angenommen, wir möchten ein Element in die Warteschlange einfügen. Wenn die Warteschlange voll ist, wird die put()-Methode warten, bis Platz in der Warteschlange vorhanden ist, um das Element einzufügen.

Gleichzeitig, wenn wir ein Element aus der Warteschlange löschen möchten. Wenn die Warteschlange leer ist, wird die take()-Methode warten, bis die Warteschlange das zu löschende Element enthält.

Die Implementierung von BlockingQueue in ArrayBlockingQueue

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
class Main {
    public static void main(String[] args) {
      //Eine Blockierende Warteschlange mit ArrayBlockingQueue erstellen
      BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
      try {
        //Ein Element in die Blockierende Warteschlange einfügen
        numbers.put(2);
        numbers.put(1);
        numbers.put(3);
        System.out.println("BLockingQueue: " + numbers);
        //Ein Element aus der Blockierenden Warteschlange entfernen
        int removedNumber = numbers.take();
        System.out.println("Gelöschte Nummer: ") + removedNumber);
      }
      catch(Exception e) {
          e.getStackTrace();
      }
    }
}

Ausgabenergebnis

BlockingQueue: [2, 1, 3]
Gelöschtes Element: 2

Für weitere Informationen über ArrayBlockingQueue besuchen Sie bitteJava ArrayBlockingQueue.

Warum BlockingQueue wählen?

In Java wird BlockingQueue alsThread-sicherKollektion. Dies liegt daran, dass es in Multithreading-Operationen helfen kann.

Angenommen, ein Thread fügt Elemente in die Warteschlange ein, während ein anderer Thread Elemente aus der Warteschlange löscht.

Jetzt, wenn die Geschwindigkeit der ersten Thread langsamer ist, kann die BlockingQueue den zweiten Thread blockieren, bis die erste Thread ihre Operation beendet hat.