Java取消未来 - 如何等待完成?

时间:2014-09-17 12:58:07

标签: java future futuretask

长话短说:我有一组Future个对象。其中一些已经在进行中,有些则没有。我迭代集合并调用future.cancel(false),根据文档,它应该取消当前没有运行的所有Future,但应该允许所有其他人完成。

我的问题是:在致电Future后,如何知道某个future.cancel(false)何时完成? future.isDone()始终会返回true,因为cancel()之前确实已经调用future.get(),即使CancellationException仍在运行,Future也始终会引发{{1}}。 / p>

有什么建议吗?

3 个答案:

答案 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

相关问题