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 @ 2016-10-18 16:45  牛孝祖  阅读(531)  评论(0)    收藏  举报