我创建了一个可调用对象,它可以打印几行并休眠 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。
在文档中略有说明
返回: 表示任务的期货列表,其顺序与迭代器为给定任务列表生成的顺序相同。如果 操作没有超时,每个任务都会完成。如果是这样 超时后,其中一些任务将无法完成。
和
返回后,尚未完成的任务将被取消。