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

我创建了一个可打印几行并可睡2秒的可调用函数。 我创建了一个主方法,该方法创建10个可调用实例并传递给ExecutorService的invokeALL方法。

 service.invokeAll(callableList, 3, SECONDS);

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

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

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

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


简短的回答。

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

长答案。

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

如果在预期时间内没有完成,则未完成的期货将被取消。 所以如果你有5个任务,前2个完成但第3次完成,那么3,4和5将被取消。

它在文档中略有说明

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

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

链接地址: http://www.djcxy.com/p/50183.html

上一篇: why all Future.get() throwing CancelleationException in invokeAll with timeout

下一篇: visibility of side effects when creating and joining threads