为什么所有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