java.util.concurrent并发包之CountDownLatch

一、CountDownLatch类

CountDownLatch可以使一个线程在等待另外一个线程完成工作以后再继续执行;
使用倒计时计数器实现;
当每个线程成完成任务以后,计数器就会减一;
当计数器数值为0 的时候,表示当前线程已经完成任务,然后恢复至CountDownLatch上的等待线程来继续完成任务;

二、CountDownLatch的典型使用场景

1、启动一个服务时,主线程需要等待多个组件加载完毕以后再继续执行;
2、实现多个线程开始执行任务的最大并行性;注意是并行;

三、CountDownLatch的缺点

CountDownLatch是一次性的,计数器在构造方法中只能初始化一次,之后没有任何机制再次对其重置;
当CountDownLatch使用完毕后,它就不能再次被使用;

四,CountDownLatch方法说明

//递减锁计数器,达到0时,释放所有等待线程。
public void countDown() {
        sync.releaseShared(1);
}
//当前线程在锁计数器倒计时为0之前一直处在等待状态
public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
}
//当前线程在锁计数器倒计时为0之前一直处在等待状态
//timeout等待时间
//unit时间单位
public boolean await(long timeout, TimeUnit unit)
        throws InterruptedException {
        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}

五、栗子:主线程等到子线程执行完毕在执行

public static void main(String... args) {
        final CountDownLatch countDownLatch = new CountDownLatch(3);
        Thread threadA = new Thread(()->{
            try {
                System.out.println("主线程开始等待。。。");
                //阻塞,等待countDown(),当countDown()=0就执行后面的线程
                countDownLatch.await();
                System.out.println("子线程执行完毕,主线程继续执行。。。");
            } catch (InterruptedException e) {

            }
        });

        Thread threadB = new Thread(() -> {
            System.out.println("子线程开始执行。。。");
            for (int i=3; i>0; i--){
                System.out.println(i);
                countDownLatch.countDown();//countDown减一
            }
        });

        threadA.start();
        threadB.start();
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值