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

Java取消未来-如何等待完成?,java,future,futuretask,Java,Future,Futuretask,长话短说:我有一个Future对象的集合。其中有些已经在进行中,有些还没有。我迭代收集并调用future.cancel(false),根据文档,它应该取消所有当前未运行的futures,但应该允许所有其他的完成 我的问题是:在我调用了Future.cancel(false)之后,如何知道特定的Future何时完成future.isDone()始终返回true,因为在此之前确实调用了cancel(),而future.get()始终抛出CancellationException,即使future仍在

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

我的问题是:在我调用了
Future.cancel(false)
之后,如何知道特定的
Future
何时完成
future.isDone()
始终返回
true
,因为在此之前确实调用了
cancel()
,而
future.get()
始终抛出
CancellationException
,即使
future
仍在运行


有什么建议吗?

您可以在未来的实现中添加一个标志,该标志将反映实际的未来状态

,因为
未来
对未决计算的未来结果进行建模,并且由于取消的未来不会产生该结果,合理的做法是,
Future
无法让您确定已处理结果的计算何时完成。换句话说,你需要另一个范例来实现你的目标

如果您希望等待所有提交的任务完成,那么Executor服务API直接支持的最接近的事情就是关闭整个Executor服务并等待其终止

如果上面的方法不适合您的解决方案,那么我看不到比一些定制解决方案更好的方法,例如
可运行的
的定制实现,它在侧面执行一些内务处理,以便您可以检查它何时完成运行。

给定一个
可调用的c

futureTask1 = new FutureTask<Object>(c);
futureTask2 = new FutureTask<Void>(futureTask1, null);

executor.execute(futureTask2);
如果您对结果不再感兴趣:

futureTask1.get()
futureTask1.cancel(mayInterruptIfRunning)
futureTask2.get()
如果要等待以确保可调用文件中的代码没有(也不会)运行(无论是从未调用、已完成取消还是已完成生成结果):

即使在开始工作之前取消,也会等待执行者执行计划的任务(如果已经取消,则不会执行),因此可能不必要地等待其他长时间运行的任务完成。YMMV