我想知道主线程是否一直等到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”。
任何人都可以确认此信息吗?非常感谢!
答案 0 :(得分:4)
ExecutorService.invokeAll()
文档指出(强调是我的):
执行给定的任务,返回持有它们的期货的列表 状态和结果全部完成。
ExecutorService
class documentation强调了设计用于运行任务的每种方法的这一点(强调是我的):
方法
invokeAny
和invokeAll
执行最常用的形式 批量执行,执行任务集合并然后等待 至少要完成一个或全部。
至少代表invokeAny()
, all 代表invokeAll().
答案 1 :(得分:4)
这是invokeAll(...)
的{{3}}所说的(插入我的评论):
执行给定的任务,并在所有任务完成后返回保存其状态和结果的期货列表。
注意:“什么时候完成”……不是以前。
Future.isDone()
对于返回列表的每个元素都是true。
这意味着任务已完成。
请注意,已完成的任务可能已正常终止或引发异常而终止。如果在进行此操作时修改了给定的集合,则该方法的结果不确定。
参数:任务-任务的集合
返回:代表任务的
Futures
列表,其顺序与迭代器为给定任务列表生成的顺序相同,每个任务均已完成。
再次...表示任务已经完成。
简而言之,它说{strong> 3 次任务是在invokeAll()
返回之前完成的。