java - 我首先做什么 - 取消 ScheduledFuture 或关闭 ScheduledExecutorService?

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

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

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

你怎么看?

最佳答案

在这种情况下,您只需要调用 shutdown()

ScheduledThreadPoolExecutor 中有两个选项,这是在此处幕后创建的。 getExecuteExistingDelayedTasksAfterShutdownPolicy() 默认为 truegetContinueExecutingPeriodicTasksAfterShutdownPolicy() 默认为 false。因此,简单地关闭服务将导致周期性任务被取消,但任何延迟的任务仍将被执行。由于所讨论的任务是一个周期性任务,它将在关闭时被取消。

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

关于java - 我首先做什么 - 取消 ScheduledFuture 或关闭 ScheduledExecutorService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10737350/

相关文章:

python - ProcessPoolExecutor 中的 ThreadPoolExecutor

c++ - 套接字编程中的多个请求/响应

java - 冒泡排序比较计数始终相同

java - 如何以编程方式将类或伪类添加到 JavaFX 中的自定义控件?

multithreading - Play Framework : thread-pool-executor vs fork-join-executor

python - 在python中启动多个线程

c++ - PostMessage 能否使工作线程中的变量更改在 GetMessage 之后在 UI 线程中可见?

java - JLabel 的变量不会居中?

java - Jenkins 构建 - 参数化的 Maven 目标

Java 字符串操作 HTML 标签