Ich verwende ScheduledExecutorService
, um eine Aufgabe auszuführen, die einen Dienst mit einer festen Rate aufruft. Der Dienst kann einige Daten an die Aufgabe zurückgeben. Die Task speichert Daten in einer Warteschlange. Einige andere Threads wählen langsam Elemente aus der Warteschlange aus
Wie pausiere ich den executorService, bis die von der Task aufgefüllte Warteschlange gelöscht wurde.
Wenn ein Executor ignoriert wird, akzeptiert er keine neue Task mehr und wartet darauf, dass die aktuellen beendet werden. Aber Sie möchten Ihren Executor nicht beenden, sondern einfach anhalten.
Was Sie also tun können, ist, dass Sie in Ihrer Aufgabe nur mit einer leeren Warteschlange arbeiten. Da Ihre Aufgabe nur von Zeit zu Zeit ausgeführt wird, liegt die CPU-Auslastung nahe bei 0, wenn keine Verarbeitung erforderlich ist. Dies ist das "if (! queue.isEmpty ()) return;" von Peter Lawrey Antwort.
Zweitens verwenden Sie eine blockierende Warteschlange. Das heißt, wenn Sie die Methode take () aufrufen, um ein in die Warteschlange eingereihtes Element zu erhalten, während die Warteschlange leer ist, wartet der Executor-Thread, bis automatisch ein Element zur Warteschlange hinzugefügt wird.
Also:
Sie können
tun %Vor%am Anfang.
Wenn Sie einen ScheduledExecutorService mit einer Warteschlange verwenden, warum verwenden Sie ihn, um ihn einer anderen Warteschlange hinzuzufügen. Können Sie die Warteschlange nicht einfach im Dienst verwenden?
Tags und Links java scheduled-tasks executor