详解 CountDownLatch类

   CountDownLatch这个类是一个同步的辅助类,有的地方翻译成门闩,有的地方翻译成计数器。具体来说起到什么作用,多线程的东西都不太能说清楚,仅举个例子再来谈一下。

   需求:在主线程里面开启两个线程,两个线程要做自己的事情,你可以怎么做,你可以用原生的API来做,例如这样:

Thread t1=new Thread(()->{
    try{
        //TODO
    }catch (Exception e){
        e.printStackTrace();
    }
});
Thread t2=new Thread(()->{
    try{
        //TODO
    }catch (Exception e){
        e.printStackTrace();
    }
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("主线程执行完毕");

或者使用CountDownLatch,可以用下面这种形式

 

public class TestCountDownlatch {
    private static CountDownLatch countDownLatch=new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            try {
                Thread.sleep(3000);
                countDownLatch.countDown();
                System.out.println(Thread.currentThread().getName()+"执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(()->{
            try {
                Thread.sleep(5000);
                countDownLatch.countDown();
                System.out.println(Thread.currentThread().getName()+"执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+"执行完毕");
    }
}

 我们看到在CountDownLatch初始化时,构造器中传入了一个数字,这个数字就是来初始化,让CountDownLatch来帮你管理几个线程的,内部会维护一个计数器,当调用countDown()方法时,会将这个计数器减一,调用await方法时,会检查countDownLatch内部维护的计数器是否为0,否则就会一直阻塞在这里,直到这个计数器变为0为止。 当然了,如果CountDownLatch里面的值设的和线程的不一样,或者设置大了,可能会导致主线程一直阻塞在这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值