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

中有两个选项ScheduledThreadPoolExecutor,这是这里在幕后创建的。 getExecuteExistingDelayedTasksAfterShutdownPolicy()默认为true并且getContinueExecutingPeriodicTasksAfterShutdownPolicy()默认为false. 所以,简单地关闭服务会导致周期性任务被取消,但任何延迟的任务仍然会被执行。由于有问题的任务是一个周期性的任务,它会在关机时被取消。

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

于 2012-05-24T12:31:59.510 回答