Frage

Ich habe zwei Themen. Thread A zieht einige Elemente aus der Warteschlange und Thread B fügt der Warteschlange einige Elemente hinzu.

Ich möchte, dass Faden A schlafen gehen, wenn die Warteschlange leer ist.

Wenn Thread B der Warteschlange ein Element hinzufügt, sollte sicherstellen, dass Thread A funktioniert. Wie kann das in Java geschehen?

War es hilfreich?

Lösung

Verwenden ein BlockingQueue, welches ist:

EIN Queue Dies unterstützt zusätzlich Vorgänge, die darauf warten, dass die Warteschlange beim Abrufen eines Elements nicht leer wird, und dass der Platz in der Warteschlange zur Verfügung steht, wenn sie ein Element speichern.

Im Ernst, versuchen Sie nicht, das Rad hier neu zu erfinden.




(Wenn du muss Verwenden Sie Wait/Benachrichtigung, lesen Dieses Tutorial. Aber ersparen Sie sich den Schmerz, bitte!)

Andere Tipps

Hier sind einige Details:

import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();

Das ist alles, was es mit Javas neueren Fadenfunktionen gibt. Executor ist ein Thread -Pool mit SomenumberofThreads. Es wird von einer blockierenden Warteschlange gefüttert. Alle Fäden schlafen, es sei denn, es gibt Arbeit zu erledigen. Wenn Sie ein Runnable -Objekt mithilfe der Methode Execute () in die Warteschlange drücken, sitzt das Runnable -Objekt in der Warteschlange, bis ein Thread zur Verarbeitung verfügbar ist. Dann wird die Run () -Methode aufgerufen. Schließlich signalisiert der Shutdownnow () -Methode alle Threads im Pool zum Herunterfahren.

Es ist jetzt viel einfacher als früher.

(Es gibt viele Variationen dazu, z. B. Pools mit minimaler und maximaler Anzahl von Threads, oder Warteschlangen, die maximale Größen haben, bevor Threads aufrufen, blockieren EXECUTE ().)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top