Was ist Thread-Safe BlockingQueue in Java? Wann sollten Sie es verwenden? Umsetzung beigefügt

Veröffentlicht: 2021-04-30
Was ist Threadsafe BlockingQueue in Java und wann sollten Sie es verwenden?

Bisher habe ich zwei Artikel zum Producer-Consumer-Konzept auf Crunchify geschrieben. Das erste erklärt Java Semaphore und Mutex und das zweite erklärt Concurrent Read/Write.

In diesem Java-Tutorial gehen wir auf dasselbe Producer/Consumer-Konzept ein, um die BlockingQueue in Java zu erklären.

Was sind die Vorteile der Sperrwarteschlange in Java?

Eine java.util.Queue unterstützt Operationen, die darauf warten, dass die Warteschlange beim Abrufen eines Elements nicht leer wird, und warten, bis Speicherplatz in der Warteschlange verfügbar wird, wenn ein Element gespeichert wird.

java.util.BlockingQueue in Java - Crunchify

Wir müssen vier Java-Klassen erstellen:

  1. CrunchifyMessage.java zum Setzen und Abrufen von Nachrichten
  2. CrunchifyBlockingProducer.java, um die Nachricht in die Warteschlange zu stellen
  3. CrunchifyBlockingConsumer.java, um Nachrichten aus der Warteschlange abzurufen
  4. CrunchifyBlockingMain.java, um den Test zu starten

BlockingQueue-Implementierungen sind thread-safe . Alle Warteschlangenmethoden sind atomarer Natur und verwenden interne Sperren.

Beginnen wir mit der Thread-Safe BlockingQueue-Implementierung in Java

Schritt 1

Erstellen Sie die Klasse CrunchifyMessage.java . Dies ist ein einfaches Java-Objekt.

Schritt 2

Erstellen Sie den Producer CrunchifyBlockingProducer.java , der eine einfache msg erstellt und in die Warteschlange gestellt hat.

Schritt 3

Erstellen Sie die Klasse CrunchifyBlockingConsumer.java , die die Nachricht aus der Warteschlange verarbeitet.

Schritt 4

Erstellen Sie eine einfache CrunchifyBlockingMain.java Methode, die den BlockingQueue-Test ausführt. Führen Sie dieses Programm aus, um das Verhalten von BlockingQueue zu überprüfen.

Eine BlockingQueue akzeptiert keine Null- Elemente. Implementierungen lösen NullPointerException bei Versuchen aus , eine Null hinzuzufügen , einzufügen oder anzubieten .

Eine Null wird als Sentinel-Wert verwendet, um das Fehlschlagen von Abfrageoperationen anzuzeigen.

Ergebnis:

Wann sollten wir java.util.concurrent.BlockingQueue verwenden?

  • Wenn Sie eine eingehende Anfrage drosseln möchten, sollten Sie dasselbe verwenden
  • Ein Erzeuger kann den Verbrauchern mit einer unbegrenzten Warteschlange weit voraus sein. Wenn der Consumer den Producer nicht einholt, kann dies zu einem OutOfMemoryError . In solchen Situationen kann es besser sein, einem potenziellen Produzenten zu signalisieren, dass die Warteschlange voll ist, und bei einem Fehler schnell aufzugeben.
    • Mit anderen Worten: Die Erzeuger werden natürlich gedrosselt.
  • Blocking Queue wird normalerweise in der gleichzeitigen Anwendung verwendet
  • Es bietet eine korrekte, Thread-sichere Implementierung
  • Der Speicherverbrauch sollte ebenfalls begrenzt werden