为什么ExecutorService.invokeAll()返回Future的List?

时间:2016-05-21 20:10:57

标签: java concurrency

invokeAll()在提交的Callable中的所有Collection完成后才会返回,那么结果Future的原因是什么?

2 个答案:

答案 0 :(得分:4)

因为任务可能正常终止或异常终止,Callable<Integer> c1 = () -> 1; Callable<Integer> c2 = () -> { throw new RuntimeException(); }; List<Future<Integer>> futures = executor.invokeAll(Arrays.asList(c1,c2)); for (Future<Integer> future : futures) { System.out.println(future.get()); } 可以为您包装异常。例如,

Future

请注意,由于invokeAll,我们能够获得正常终止的未来结果以及异常终止的结果。

如果List<T>返回class dice extends nplayer{ private $face1; private $face2; public function roll(){ $die = array('1', '2', '3', '4', '5', '6'); $randDie = array_rand($die); $this->face1=$randDie; ... } } class nplayer{ private $name; private function __construct($nam){ $this->namw=$nam; } public function play(){ $this->roll(); } public function show($name){ print "<...>"; } } class resuts{ } ,则必须返回成功完成的内容并丢弃具有例外情况的内容。

答案 1 :(得分:0)

检查ExecutorService#invokeAll Javadoc

  

执行给定的任务,返回持有他们的期货清单   完成后的状态和结果。 Future.isDone()对每个都是正确的   返回列表的元素。 请注意,已完成的任务可能有   正常终止或通过抛出异常终止。 结果   如果修改了给定的集合,则此方法未定义   此操作正在进行中。

表示我们正在获取Future个对象的列表,因为即使任务完成,我们也可能无法获取值。