2012-05-24 2 views
14

マイコード:まず何をすればいいですか?ScheduledFutureをキャンセルするか、ScheduledExecutorServiceを終了しますか?

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(); 

が、私は右ここにいますか?多分私はする必要があります:

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

あなたはどう思いますか?

答えて

22

この場合、shutdown()に電話する必要があります。

ScheduledThreadPoolExecutorには2つのオプションがあります。これはここではバックグラウンドで作成されているものです。 getExecuteExistingDelayedTasksAfterShutdownPolicy()のデフォルトはtrueで、getContinueExecutingPeriodicTasksAfterShutdownPolicy()のデフォルトはfalseです。したがって、単にサービスをシャットダウンすると、定期的なタスクはキャンセルされますが、遅延したタスクは引き続き実行されます。問題のタスクは定期的なタスクなので、シャットダウン時にキャンセルされます。

個人的には、シャットダウンする前に.cancel(true)を手動で呼び出す方が良いという意見があります。動作上はこれと異なる効果はありませんが、定期的なタスクがシャットダウン時にキャンセルされることを確認するために、エグゼキュータのオプションを知らないプログラマーにとっては良いことだと思います。つまり、誰かが入ってきて、エグゼキュータをシャットダウン時にキャンセルしないものに変更した場合でも、このタスクはキャンセルされます。だから、実際には、ここでの主な利点はコードの明快さです。

関連する問題