Java取消Future - 如何等待完成?

12
长话短说:我有一组Future对象。其中一些正在进行中,而另一些则没有。我遍历集合并调用future.cancel(false),根据文档说明,这应该取消所有未在运行的Future,但应允许所有其他Future完成。
我的问题是:在调用future.cancel(false)后,如何知道特定的Future何时完成?future.isDone()总是返回true,因为确实在此之前调用了cancel()future.get()始终抛出,即使Future仍在运行。
有任何建议吗?
3个回答

1
给定一个 `Callable<Object> c`:
futureTask1 = new FutureTask<Object>(c);
futureTask2 = new FutureTask<Void>(futureTask1, null);

executor.execute(futureTask2);

现在如果你想要结果:
futureTask1.get()

如果您不再对结果感兴趣:
futureTask1.cancel(mayInterruptIfRunning)

如果您想等待确保可调用对象中的代码未运行(无论是从未调用,已取消完成还是已生成结果):

futureTask2.get()

即使在它开始工作之前被取消,它仍然会等待执行器执行预定任务(如果已经取消,则什么也不做),因此这可能会不必要地等待其他长时间运行的任务完成。个人经验可能有所不同。

1
你可以给你的Future实现添加一个标志,以反映实际的Future状态。

1
由于Future模型了一个有待完成计算的未来结果,而在取消的future中该结果不会出现,因此,没有办法通过Future找到已经被丢弃的计算何时完成是合理的。换句话说,您需要另一种范例来实现您的目标。如果您希望等待所有提交的任务完成,最接近Executor Service API直接支持的方法是关闭整个执行器服务并等待其终止。如果以上方法不适用于您的解决方案,则我认为没有比一些自定义解决方案更好的方法,例如Runnable的自定义实现,它会在旁边进行一些清理工作,以便您可以检查它何时完成运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接