主线程等待其他线程执行结束的几种方式

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.

...

posted on   wendellup  阅读(282)  评论(0编辑  收藏  举报

编辑推荐:
· 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)
· 程序员常用高效实用工具推荐,办公效率提升利器!

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示