zoukankan      html  css  js  c++  java
  • Java线程--CountDownLatch使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867656.html

    Java线程--CountDownLatch使用, 代码里头有详细注释:

    public static void main(String[] args) throws InterruptedException {
            /**
             * 基于计数器的线程等待-完毕执行控制器
             * 线程A调用await()方法后, 只有计数为0, 线程A才能继续执行, 否则将一直挂起
             */
            CountDownLatch countDownLatch = new CountDownLatch(2);
            System.out.println("主线程开始执行");
            ExecutorService service1 = Executors.newSingleThreadExecutor();
            service1.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                        System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    /**
                     * 计数器的值减1
                     */
                    countDownLatch.countDown();
                }
            });
            service1.shutdown();
    
            ExecutorService service2 = Executors.newSingleThreadExecutor();
            service2.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    /**
                     * 计数器的值减1
                     */
                    System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
                    countDownLatch.countDown();
                }
            });
            service2.shutdown();
            System.out.println("等待两个线程执行完毕…… ……");
            try {
                /**
                 * 主线程里面调用的await()方法, 那么主线程在这里会被挂起,
                 * 等到countDownLatch的计数为0的时候再继续回来执行
                 */
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("两个子线程都执行完毕,继续执行主线程");
        }

     打印如下:

    主线程开始执行
    等待两个线程执行完毕…… ……
    子线程:pool-1-thread-1执行
    子线程:pool-2-thread-1执行
    两个子线程都执行完毕,继续执行主线程
  • 相关阅读:
    Luogu4233 射命丸文的笔记 DP、多项式求逆
    LOJ2267 SDOI2017 龙与地下城 FFT、概率密度函数、Simpson
    LOJ2882 JOISC2014 两个人的星座 计算几何
    UOJ343 清华集训2017 避难所 构造、打表
    Solution -「CTS2019」珍珠
    「珂朵莉树」学习笔记
    CSP2019-J/S 游记
    LeetCode(164)Maximum Gap
    LeetCode(165) Compare Version Numbers
    LeetCode(162) Find Peak Element
  • 原文地址:https://www.cnblogs.com/fanerwei222/p/11867656.html
Copyright © 2011-2022 走看看