我该怎么办 - 取消ScheduledFuture或关闭ScheduledExecutorService?

yeg*_*256 16 java multithreading

我的代码:

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();
Run Code Online (Sandbox Code Playgroud)

我在这儿吗?也许我应该这样做:

service.shutdown();
future.cancel(true);
Run Code Online (Sandbox Code Playgroud)

你怎么看?

Eri*_*son 23

在这种情况下,您只需要拨打电话shutdown().

有两个选项ScheduledThreadPoolExecutor,这是在幕后创建的. getExecuteExistingDelayedTasksAfterShutdownPolicy()默认为truegetContinueExecutingPeriodicTasksAfterShutdownPolicy()默认为false.因此,简单地关闭服务将导致定期任务被取消,但任何延迟的任务仍将被执行.由于有问题的任务是一项定期任务,因此将在关闭时取消.

我个人认为最好.cancel(true)在关机前手动拨打电话.虽然在操作上这没有什么不同的效果,但我认为对于那些可能不知道执行程序上的选项的程序员来说,看到周期性任务意味着在关闭时被取消是有好处的.这也意味着如果有人进来并将执行程序更改为在关闭时未取消的执行程序,则此任务仍将被取消.所以,我认为这里的主要好处是清晰的代码.