歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java多線程-CountDownLatch

簡介

一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。用給定的計數 初始化 CountDownLatch。由於調用了 countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的線程,await 的所有後續調用都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,請考慮使用 CyclicBarrier。

實例

通過CountDownLatch來實現主線程和子線程通信,主線程發送命令啟動子線程,子線程全部完成後通知主線程。

代碼:

public class CountDownLatchTest {
    public static void main(String[] args) {
        final CountDownLatch cdOrder = new CountDownLatch(1);
        final CountDownLatch cdAnswer = new CountDownLatch(3);
        ExecutorService threadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 3; i++) {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                       
                        System.out.println(Thread.currentThread().getName()+"正在等待命令");
                        cdOrder.await();//子線程等待
                        System.out.println(Thread.currentThread().getName()+"接受命令");
                        Thread.sleep(new Random().nextInt(10000));
                        System.out.println(Thread.currentThread().getName()+"發出應答");
                        cdAnswer.countDown();//當cdAnswer為0時,主線程收到回復
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            };
            threadPool.execute(runnable);
        }
       
        /*
        * 主線程
        */
        try {
            Thread.sleep(new Random().nextInt(10000));
            System.out.println(Thread.currentThread().getName()+"即將發出命令");
            System.out.println(Thread.currentThread().getName()+"發出命令");
            cdOrder.countDown();//啟動子線程
            cdAnswer.await();//等待子線程回復
            System.out.println(Thread.currentThread().getName()+"收到應答");
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
       
       
        threadPool.shutdown();
    }
}

Copyright © Linux教程網 All Rights Reserved