【问题标题】:ScheduledExecutorService: How can I wait for cancelled tasks to finish?ScheduledExecutorService:如何等待取消的任务完成?
【发布时间】:2015-10-14 17:02:46
【问题描述】:

我在ScheduledExecutorService 中安排了一些任务。关闭时,我想取消它们,并在它们全部完成后释放数据库锁。

如何等待已取消的任务完成处理?

尝试的解决方案

  • 根据我的测试,future.cancel() 在任务停止执行之前不会阻塞
  • future.cancel() 之后调用 future.get() 会立即导致 CancelledExecutionException
  • 我不想等待整个执行器关闭,因为它在组件之间共享

【问题讨论】:

    标签: java scheduledexecutorservice


    【解决方案1】:

    如何等待已取消的任务完成处理?

    这样做的问题是取消是在尽力而为的基础上完成的。 javadoc 状态

    尝试取消此任务的执行。此尝试将失败,如果 任务已经完成、已经被取消或可能 不会因为其他原因取消。

    通常,取消是通过中断实现的,而中断是一种约定。没有任何东西可以保证它会正确实施。因此,即使您确实发送了cancel,也无法保证底层任务(如果已经运行)将完成取消。

    没有可靠的方法来实现您的用例。

    【讨论】:

    • 我知道取消的请求不一定会被兑现,但即使不是,任务也会在某个时候完成。我怎么能等到那个时候?
    • @meriton 使用典型的ScheduledExecutorService,afaik,你不能。尝试查看CompletionService。或者,您可以将提交的 Runnable 实例包装在以某种方式通知您的 Runnable 实现中。 Future 不会在这里做。
    • 天哪,这就是我害怕的。 CompletionService 不允许我区分已完成的任务是否是我的一项,但如果我有一个非共享的 CompletionService,我还不如使用我关闭的专用 ScheduledExecutorService。所以要么就是这样,要么自己改变任务。我想我会选择后者,并让他们通过检查 volatile 字段的取消请求来明确实施取消。
    • @meriton 您可能还需要考虑查看子类型ScheduledExecutorService 并实现自定义afterExecute 方法来通知您完成(取消时)。我不认为这是微不足道的。
    • 我同意 :-) ...如果我必须这样做,我会放弃执行程序并使用简单的旧 Threads,它具有方便的 join 方法。无论如何,感谢您确认这确实非常困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多