2012-05-24 10 views
14

My Code:Was muss ich zuerst tun - GeplanteFuture abbrechen oder ScheduledExecutorService herunterfahren?

ScheduledServiceExecutor service = Executors.newSingleThreadScheduledExecutor(); 
ScheduledFuture future = service.scheduleWithFixedDelay(
    runnable, 1, 1, TimeUnit.MILLISECONDS 
); 
// ... 
// now it's time to shut it all down 
future.cancel(true); 
service.shutdown(); 

ich hier richtig? Vielleicht sollte ich tun:

service.shutdown(); 
future.cancel(true); 

Was denkst du?

Antwort

22

In diesem Fall benötigen Sie nur den Anruf an shutdown().

Es gibt zwei Optionen in der ScheduledThreadPoolExecutor, die hier hinter den Kulissen erstellt wird. getExecuteExistingDelayedTasksAfterShutdownPolicy() ist standardmäßig auf true und getContinueExecutingPeriodicTasksAfterShutdownPolicy() voreingestellt auf false. Wenn Sie also den Dienst einfach herunterfahren, werden regelmäßige Aufgaben abgebrochen, aber alle verzögerten Aufgaben werden weiterhin ausgeführt. Da die betreffende Aufgabe eine periodische Aufgabe ist, wird sie beim Herunterfahren abgebrochen.

Meine persönliche Meinung ist, dass es besser ist, die .cancel(true) vor dem Herunterfahren manuell aufzurufen. Während dies in der Praxis keine unterschiedlichen Auswirkungen hat, ist es gut für Programmierer, die die Optionen auf dem Executor möglicherweise nicht kennen, um zu sehen, dass die periodische Aufgabe beim Herunterfahren abgebrochen werden soll. Dies bedeutet auch, dass, wenn jemand jemals hereinkommt und den Executor zu einem ändert, der beim Herunterfahren nicht abbricht, diese Aufgabe trotzdem abgebrochen wird. Also wirklich, ich denke der Hauptvorteil hier ist die Klarheit des Codes.

Verwandte Themen