我创建了一个可调用的字符串,可以打印几行并睡眠2秒钟。我创建了一个main方法,它创建了10个可调用的实例,并传递给了ExecutorService的invokeALL方法。
service.invokeAll(callableList, 3, SECONDS);
当我迭代返回的Future对象列表时。我收到了CancellationException。
我正在测试是否所有 future.get()调用都会导致 CancellationException ,或者只是那些无法完成并被取消的任务。
无论 invokeALL 中的时间设置如何,我都会获得所有结果或所有 CancellationExceptions 。
当我打电话给 future.get()时,我真的希望至少有一些任务可以完成并返回给我结果。
答案 0 :(得分:2)
简短回答。
所有任务都没有在3秒内完成。
答案很长。
TPE将运行所有任务并等待它们完成。它将在每个未来执行get
,并以3秒作为get
方法的等待时间。如果所有任务在不到3秒的时间内完成,则Futures列表将不受影响地返回。
如果未在预期时间内完成,则取消未完成的期货。因此,如果您有5个任务,前2个完成但第3个完成,则取消3,4和5。
文档中略有说明
返回: 表示任务的Futures列表,其顺序与迭代器为给定任务列表生成的顺序相同。如果 操作没有超时,每个任务都会完成。如果确实如此 超时,其中一些任务将无法完成。
和
返回后,未完成的任务将被取消。