16

私のコード:

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

どう思いますか?

4

1 に答える 1

24

この場合、 への呼び出しのみが必要ですshutdown()

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

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

于 2012-05-24T12:31:59.510 に答える