invokeAll()是否停止主线程?

时间:2019-07-02 06:19:08

标签: concurrency java-8 invokeall

我想知道主线程是否一直等到invokeAll()参数中的所有任务都完成才继续。这是我的代码,看来确实如此。

public static void main(String[] args) throws InterruptedException {

    ExecutorService service = null;
    try
    {
        service = Executors.newCachedThreadPool();
        List<Callable<?>> list = new ArrayList<>();
        for(int i = 0; i < 1000; i++)
        {
            list.add(() -> {System.out.println("Not yet"); return null;});
        }
        service.invokeAll(list);
        System.out.println("END!"); // Output "END" at last no matter what
    }
    finally
    {
        if(service != null)
        {
            service.shutdown();
        }
    }
}

如您所见,无论我创建了多少个任务,无论是1000还是10000,该程序最后仍会输出“ END”。

任何人都可以确认此信息吗?非常感谢!

2 个答案:

答案 0 :(得分:4)

ExecutorService.invokeAll()文档指出(强调是我的):

  

执行给定的任务,返回持有它们的期货的列表   状态和结果全部完成

ExecutorService class documentation强调了设计用于运行任务的每种方法的这一点(强调是我的):

  

方法invokeAnyinvokeAll执行最常用的形式   批量执行,执行任务集合并然后等待   至少要完成一个或全部

至少代表invokeAny() all 代表invokeAll().

答案 1 :(得分:4)

这是invokeAll(...)的{​​{3}}所说的(插入我的评论):

  

执行给定的任务,并在所有任务完成后返回保存其状态和结果的期货列表。

注意:“什么时候完成”……不是以前。

  

Future.isDone()对于返回列表的每个元素都是true。

这意味着任务已完成。

  

请注意,已完成的任务可能已正常终止或引发异常而终止。如果在进行此操作时修改了给定的集合,则该方法的结果不确定。

     

参数:任务-任务的集合

     

返回:代表任务的Futures列表,其顺序与迭代器为给定任务列表生成的顺序相同,每个任务均已完成。

再次...表示任务已经完成


简而言之,它说{strong> 3 次任务是在invokeAll()返回之前完成的。