java - 为什么在一个循环中加入所有线程与一次启动和加入一个线程不同?
问题描述
我准备了两个线程示例来展示。我的目标是创建 10 个线程,并让它们同时并行运行。另外,我希望我的应用程序在执行其他任何操作之前等待所有线程的执行。
在第一个示例中,线程立即启动并加入。这使得 JVM 等待刚刚加入的线程完成,然后再将另一个线程添加到数组中。这不是我想要的行为。
public void example1() throws InterruptedException{
ExampleThread[] threads = new ExampleThread[10];
for(int i=0;i<10;i++){
threads[i] = new ExampleThread();
threads[i].start();
threads[i].join();
}
}
在第二个示例中,所有线程都已启动,并且一个单独的循环将它们连接起来,一次一个。这再现了我想要的行为。
public void example2() throws InterruptedException{
ExampleThread[] threads = new ExampleThread[10];
for(int i=0;i<10;i++){
threads[i] = new ExampleThread();
threads[i].start();
}
for (ExampleThread thread : threads) {
thread.join();
}
}
问题:
- JVM 实际上是
join
一次运行所有方法吗? - 是在调用另一个方法之前等待第一个
join
方法解决吗? - 这是实现我描述的行为的可靠方法吗?(除了ExecutorService,可能会更好)
我试图了解 java 线程的标准行为。任何帮助,将不胜感激。
解决方案
join()
阻塞直到线程终止(如@shmosel所说)。所以这意味着在你的第一个例子中,在完成threads[i+1]
之前不会被创建threads[i]
。
在您的第二个示例中,所有线程都被创建并并行运行,然后您等待每个线程完成。
推荐阅读
- apache-spark - 如何在 7 天内刷新一次运行结构化流式 Spark 应用程序的 kerberos 票证?
- java - 解析函数无法解析字符串并在 Java 中抛出错误
- python - Flask Bcrypt 密码哈希不匹配,如何解决?
- discord.py - Discord.py 嵌入文本文件,获得更多结果
- node.js - Heroku 部署后 React 应用程序未加载
- react-native - 本机基础复选框显示连字符而不是刻度
- sql - SQL查询的奇怪条件
- flask - 获取请求结果时邮递员 500 内部服务器错误中的错误
- python - QStackedWidget 打开多个窗口
- apache-flink - flink应用中如何指定两个source,一个process operator,一个sink operator