Java父线程(或是主线程)等待所有子线程退出

复制代码
       static void testLock1(){
           
            final AtomicInteger waitCount = new AtomicInteger(30000);
            final Object waitObj = new Object();
            System.out.println("start"+System.currentTimeMillis());
            for (int i=0;i<30000;i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        waitCount.decrementAndGet();
                        synchronized(waitObj){
                            waitObj.notifyAll();
                        }
                    }
                }).start();
            }
            while( waitCount.intValue()>0) {
                synchronized (waitObj) {
                    if(waitCount.intValue()>0){
                        try {
                            waitObj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            System.out.println("ok"+System.currentTimeMillis());
       }
       static void testLock2(){
           
           final CountDownLatch workLauch = new CountDownLatch(30000);//计数器
           System.out.println("start2"+System.currentTimeMillis());
            for (int i=0;i<30000;i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        workLauch.countDown();
                    }
                }).start();
            }
            try {
                workLauch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ok2"+System.currentTimeMillis());
       }
        public static void main(String[] args) {
            testLock1();
            testLock2();
        }
复制代码

第一种是我随便写的实现,有点糙。第二种是朋友告知的一个类,java的concurrent中的,据说还有几个相似功能的类实现。这30000个线程 时间差大概是不到200ms的样子

嗯。。。。吃饭的家伙都没学精,好惭愧。

posted @   牛孝祖  阅读(525)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示