ScheduledExecutorService anhalten

8

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

%Vor%

Wie pausiere ich den executorService, bis die von der Task aufgefüllte Warteschlange gelöscht wurde.

    
artfullyContrived 01.07.2011, 08:00
quelle

2 Antworten

3

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 einen Executor nicht gerade anhalten Es würde Ihren Code komplizieren.
  • Eine blockierende Warteschlange funktioniert genau nach dem Entwurf Was Sie brauchen: Blockieren der Aufgabe, wenn Die Warteschlange ist leer.
  • Wenn Sie es vorziehen, können Sie einfach das lassen periodische Aufgabe ausführen und prüfen, ob die Warteschlange isEmpty.
  • Du solltest schon einen oder den benutzen sonst irgendwie in Ihrer Aufgabe sonst hättest du NullPointerException wenn die Warteschlange ist leer.
Nicolas Bousquet 01.07.2011, 08:36
quelle
3

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?

    
Peter Lawrey 01.07.2011 08:13
quelle

Tags und Links