主线程等待其他线程执行结束的几种方式
1.yield
主线程通过 Thread.activeCount()>1 方式判断子线程是否结束运行。
class MyThread extends Thread {
@Override
public void run() {
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class UseExecutors {
public static void main(String[] args) {
try {
ExecutorService pool = Executors.newFixedThreadPool(10);
pool.execute(new MyThread());
pool.shutdown();
System.out.println("main end...");
while(Thread.activeCount()>1){ //保证前面的线程都执行完
System.out.println(Thread.activeCount());
Thread.yield();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
System.out.println("finally...");
System.exit(0);
}
}
}
2.AtomicInteger
class MyThread2 extends Thread {
@Override
public void run() {
try {
MainThreadWait_AtomicInteger.runThreadCount.incrementAndGet();
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
MainThreadWait_AtomicInteger.runThreadCount.decrementAndGet();
}
}
}
public class MainThreadWait_AtomicInteger {
public static AtomicInteger runThreadCount = new AtomicInteger(0);
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(10);
pool.execute(new MyThread2());
pool.execute(new MyThread2());
pool.execute(new MyThread2());
pool.shutdown();
while(true){
if(runThreadCount.get()==0){
System.out.println("other thread end...");
break;
}
}
System.out.println("main end...");
}
}
3.CountDownLatch
class MyThread3 extends Thread {
CountDownLatch countDownLatch;
public MyThread3(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
countDownLatch.countDown();
}
}
}
public class MainThreadWait_CountDownLatch {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(3);
ExecutorService pool = Executors.newFixedThreadPool(10);
pool.execute(new MyThread3(countDownLatch));
pool.execute(new MyThread3(countDownLatch));
pool.execute(new MyThread3(countDownLatch));
pool.shutdown();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main end...");
}
}
4.join.
5.future.
...
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!