长话短说:我有一组Future
个对象。其中一些已经在进行中,有些则没有。我迭代集合并调用future.cancel(false)
,根据文档,它应该取消当前没有运行的所有Future
,但应该允许所有其他人完成。
我的问题是:在致电Future
后,如何知道某个future.cancel(false)
何时完成? future.isDone()
始终会返回true
,因为cancel()
之前确实已经调用future.get()
,即使CancellationException
仍在运行,Future
也始终会引发{{1}}。 / p>
有什么建议吗?
答案 0 :(得分:2)
由于Future
模拟了未决计算的未来结果,并且由于该结果不会从取消的未来出现,因此Future
无法找出何时计算的结果是合理的结果已经处理完毕。换句话说,您需要另一种范例来实现您的目标。
如果您希望等待所有提交的任务完成,则Executor Service API直接支持的最接近的事情是关闭整个执行程序服务并等待其终止。
如果以上内容不适合您的解决方案,那么我没有看到比某些自定义解决方案更好的方法,例如Runnable
的自定义实现,它会在侧面进行一些内务处理以便您可以检查它何时完成运行。
答案 1 :(得分:1)
您可以在Future实施中添加一个标志,以反映实际的未来'状态
答案 2 :(得分:0)
给出Callable<Object> c
:
futureTask1 = new FutureTask<Object>(c);
futureTask2 = new FutureTask<Void>(futureTask1, null);
executor.execute(futureTask2);
现在,如果你想要结果:
futureTask1.get()
如果您不再对结果感兴趣:
futureTask1.cancel(mayInterruptIfRunning)
如果你想等待确保callable中的代码不会(并且不会)运行(无论是从未调用,完成取消还是完成生成结果):
futureTask2.get()
即使在它开始工作之前被取消,它也会等待执行程序执行计划任务(如果已经取消则不会执行任何操作),因此这可能不必要等待其他长时间运行的任务完成。 YMMV