2

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

 service.invokeAll(callableList, 3, SECONDS);

当我迭代返回的未来对象列表时。我收到 CancellationException。

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

无论invokeALL中的时间设置如何,我都会得到所有结果或所有CancellationExceptions

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

4

1 回答 1

2

简短的回答。

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

长答案。

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

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

在文档中略有说明

返回:代表任务的 Future 列表,其顺序与给定任务列表的迭代器生成的顺序相同。如果操作没有超时,则每个任务都已完成。如果确实超时,其中一些任务将无法完成。

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

于 2013-09-19T13:31:30.010 回答