2016-06-29 11 views
0

Nach der Erforschung des Internets konnte ich keine Antwort finden, so hoffe ich, dass jemand hier.Executor-Service mit mehreren Aufgaben für jeden Thread

Ich habe einen Executorservice mit mehreren Threads (sagen wir 2 zur Vereinfachung). Auf jedem Thread übergebe ich ein Runnable, das viele Tests enthält. Diese Tests verwenden eine Software auf meinem Computer.

Mein Szenario ist, dass, wenn Test auf einem Thread fehlschlägt - ich muss die Software auf meinem Computer neu starten.

Also wenn ein Test auf Thread eins jetzt die Software neu starten muss - muss ich die Arbeit des zweiten Threads pausieren (alle Threads müssen grundsätzlich pausieren, einschließlich Thread eins).

Auf dem zweiten Thread ein Test möglicherweise die Software verwenden - also möchte ich diesen laufenden Test beenden - pausieren Sie die nächsten Tests in Zeile/der Thread selbst - starten Sie die Software - und die Arbeit an beiden (allen) Threads .

Dinge, die ich versucht habe und nicht ganz sicher, wie zu implementieren sind: alle Angebote von John aus diesen Videos: Advanced Java: Multi-threading.

Vielen Dank im Voraus für Ihre Hilfe.

+0

Sie möchten also den Thread-Pool shutdownNow(), wenn eine Aufgabe fehlschlägt? –

Antwort

0

Ich empfehle Ihnen einen Blick auf ScheduledThreadPoolExecutor.

Sie könnten eine Instanz von Singleton implementieren, die den Status (Pause/Lauf) für Ihre Software speichert (kümmern Sie sich um die Nebenläufigkeit), und für jeden Ihrer Runnable Test, überprüfen Sie den Zustand am Anfang von die Hinrichtung. Wenn der Status gehalten wird, planen Sie die Aufgabe mit einer kleinen Verzögerung neu (bewerten Sie die Neustartzeit Ihrer Software). Das heißt, Sie sollten dem ServiceExecutor sicher einen Eingabeparameter des Konstruktors Ihrer Aufgabe übergeben (und ihn als Variable speichern).

+0

Das OP verwendet bereits einen ExecutoreService, können Sie sagen, wie die Verwendung eines Geplanten einen Unterschied machen wird? –

+0

Sie müssen 'Schedule' für eine Aufgabe anstelle von' Ausführen' verwenden, um eine Aufgabe für die zweite und folgende Zeiten auszuführen. Dies ist mit keinem 'ExecutorService' möglich. –

+0

Ich stimme zu, dass Sie scheduleAt ... verwenden müssen, um sich wiederholende Aufgaben zu haben. Ich bin mir nicht sicher, ob das der OP danach gefragt hat. –