为什么所有 Future.get() 在 invokeAll 中抛出 CancelleationException,超时



我创建了一个可调用对象,它可以打印几行并休眠 2 秒钟。我创建了一个 main 方法,它创建了这个可调用的 10 个实例,并传递给 ExecutorService 的 invokeALL 方法。

 service.invokeAll(callableList, 3, SECONDS);

当我迭代返回的未来对象列表时。我收到取消例外。

我正在测试所有 future.get() 调用是否会导致取消异常,或者只有那些无法完成并被取消的任务。

我得到所有结果或所有取消异常,无论调用ALL中的时间设置如何。

真的期待至少有一些任务会完成,并在我调用 future.get() 时返回我结果。

简短的回答。

所有任务都不会在 3 秒内完成。

长答案。

TPE 将运行所有任务并等待它们完成。 它将在每个将来执行get,其中 3 秒作为 get 方法的等待时间。 如果所有任务在 3 秒内完成,则期货列表将不受影响地返回。

如果未在预期时间内完成,则取消未完成的期货。 因此,如果您有 5 个任务,前 2 个任务完成但第 3 次超时,则取消 3、4 和 5。

在文档中略有说明

返回: 表示任务的期货列表,其顺序与迭代器为给定任务列表生成的顺序相同。如果 操作没有超时,每个任务都会完成。如果是这样 超时后,其中一些任务将无法完成。

返回后,尚未完成的任务将被取消。

相关内容

  • 没有找到相关文章

最新更新