2013-02-20 6 views
18

Soll ein Executor-Objekt nach einer shutdown wiederverwendet werden? Ich meine, wenn ich shutdown oder shutdownNow aufrufen, nachdem der Executor beendet wird, sollte ich new tun, um einen neuen Thread-Pool zu erstellen, oder ist es möglich, den zuvor terminierten Executor irgendwie "reset"/wiederzuverwenden und wiederzuverwenden?Soll ein Executor wiederverwendet werden?

Update:
Wenn ich neue Thread-Pool erstellen müssen, wie kann ich „verstehen“, dass die vorherige beendet wurde?
Zum Beispiel Folgendes:

public void startPool(){ 
    if(threadPool != null && !threadPool.isShutdown()){ 
    return; 
    } 
    threadPool = Executors.newCachedThreadPool(); 
    //other stuff 

} 

public void stopPool(){ 
    if(threadPool != null){ 
    threadPool.shutdown(); 
    } 
} 

Funktioniert nicht. Wenn ich stop und dann start rufe, wird ein neuer Thread-Pool aufgrund von Bedingungen nicht erstellt. Was ist der richtige Weg, dies zu programmieren?

+1

sollte das nicht '... && sein!threadPool.isShutdown() 'so dass Sie früh nur zurückkehren, wenn das TP noch läuft (d. h. _started_)? –

+0

@RalfH: Guter Punkt! Aktualisiert OP – Jim

+0

OK, und Sie rufen 'stop', gefolgt von' start' vom selben Thread? –

Antwort

16

Von the doc:

Nach der Kündigung hat ein Testamentsvollstrecker keine Aufgaben aktiv ausgeführt wird, keine Aufgaben Hinrichtung warten, und es werden keine neuen Aufgaben können

so (kurz) eingereicht werden, nein, Sie können es nicht wiederverwenden. Von the shutdown() doc:

:

Initiiert ein ordnungsgemäßes Herunterfahren, bei dem zuvor übergebene Aufgaben ausgeführt werden, aber keine neuen Aufgaben akzeptiert werden.

Die Methoden isTerminated()isShutdown() und können zur Bestimmung verwendet werden, wenn die Ausführende Abschaltung ist, und dass die Aufgaben bzw. abgeschlossen haben.

+0

Siehe Update – Jim

5

1) Sie können keine ThreadPoolExecutor nach Abschaltung wieder verwenden, API

An ExecutorService can be shut down, which will cause it to reject new tasks 

Hinweis: nicht Abschaltung ein ThreadPoolExecutor, wenn Sie es wieder verwenden wollen.

2) Wenn Sie wissen wollen, ob Sie Ihre ThreadPoolEdxecutor

ExecutorService.isShutdown() 

Gibt true zurück, wenn diese Testamentsvollstrecker nach unten

geschlossen worden Wir sprechen über Oracla Javas ThreadPoolExecutor
+0

Bitte siehe Update – Jim

+0

OK, ich habe auch meine Antwort aktualisiert –

+0

Im Wesentlichen müsste ich 'threadPool = null' in' stop' machen, oder? Wäre das ein Problem? – Jim

5

verwenden müssen, neu erstellen (die Umsetzung der Executor Schnittstelle) hier. Es erfordert das Verfahren Kommentar beim Herunterfahren nicht explizit einen Übergang Shutdown verbieten zurück zu Laufe, aber die Klasse Kommentar listet alle von ThreadPoolExecutors unterstützten Übergänge und es gibt keinen Weg zurück von Shutdown. Zurückgehen würde eine andere Methode erfordern Neustart/Start oder ähnlich. Dies gibt es nicht, aber jemand, der es für nützlich hält, könnte die Schnittstelle erweitern und den Neustart nach dem Herunterfahren implementieren, ohne die Shutdown-Semantik zu unterbrechen. Dies wäre wahrscheinlich ein wenig schwierig, da das Herunterfahren selbst nicht garantiert, dass die Verarbeitung letztendlich stoppt. So können die Arbeiter weitermachen, bis sie fertig sind, wenn sie überhaupt fertig sind. Unter diesen Umständen einen Neustart zu ermöglichen, war die zusätzliche Arbeit wahrscheinlich nicht wert, verglichen mit der Erstellung eines anderen Executors.