10

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

我的问题是:我怎么知道Future在我打电话后什么时候完成future.cancel(false)future.isDone()总是返回true,因为cancel()在此之前确实被调用并且future.get()总是抛出 aCancellationException即使Future仍在运行。

有什么建议么?

4

3 回答 3

1

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

于 2014-09-17T13:08:11.193 回答
1

由于Future对未决计算的未来结果进行建模,并且由于该结果不是来自取消的未来,因此Future您无法确定其结果已被处理的计算何时完成是合理的。换句话说,您需要另一种范式来通过这种方法实现您的目标。

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

如果以上内容不适合您的解决方案,那么我认为没有比某些自定义解决方案更好的方法,例如 的自定义实现Runnable,它会在侧面进行一些内务处理,以便您可以检查它何时完成运行。

于 2014-09-17T13:14:44.820 回答
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()

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

于 2016-01-08T10:13:53.700 回答