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

时间:2013-09-19 13:13:56

标签: java multithreading executorservice

我创建了一个可调用的字符串,可以打印几行并睡眠2秒钟。我创建了一个main方法,它创建了10个可调用的实例,并传递给了ExecutorService的invokeALL方法。

 service.invokeAll(callableList, 3, SECONDS);

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

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

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

当我打电话给 future.get()时,我真的希望至少有一些任务可以完成并返回给我结果。

1 个答案:

答案 0 :(得分:2)

简短回答。

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

答案很长。

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

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

文档中略有说明

  

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

  

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