类CountDownLatch的使用

1.简介

允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。
一个CountDownLatch初始化为给定数。该await方法将阻塞,直到由于该countDown()方法的调用导致当前计数达到零为止,此后所有等待线程都被释放,并且随后的任何awaitreturn 调用都将立即释放 。这是一种一次性现象-无法重置计数。如果您需要用于重置计数的版本,请考虑使用CyclicBarrier。

2.例子

//线程类
public class GetDataStatusThread extends Thread{
    private final CountDownLatch countDownLatch;

    public GetDataStatusThread(CountDownLatch countDownLatch){
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        System.out.println("线程【" + Thread.currentThread().getName() + "】获取状态成功!");
        countDownLatch.countDown();
        System.out.println("countDown个数:" + countDownLatch.getCount());
    }
}
//调用类
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(3);

        for (int i = 0; i < 3; i++) {
            GetDataStatusThread getDataStatusThread = new GetDataStatusThread(countDownLatch);
            getDataStatusThread.start();
        }

        //用await来阻碍所有的线程,知道countDownLatch指定的线程个数运行完成
        countDownLatch.await();
        System.out.println("所有线程都执行完成");

    }
}

结果分析:

1.注释掉countDownLatch.await();的执行结果
所有线程都执行完成
线程【Thread-0】获取状态成功!
线程【Thread-1】获取状态成功!
countDown个数:1
线程【Thread-2】获取状态成功!
countDown个数:0
countDown个数:2
分析:主线程和三个并发线程一起执行,所有主线程可能先执行。所以主线程的打印在前面。
2.不注释掉countDownLatch.await();的执行结果
线程【Thread-0】获取状态成功!
countDown个数:2
线程【Thread-2】获取状态成功!
countDown个数:1
线程【Thread-1】获取状态成功!
countDown个数:0
所有线程都执行完成
分析:主线程和三个并发线程一起执行,但是使用了await()方法,阻塞了主线程,直到countDownLatch的值减少到0,才能运行,所以主线程的打印在最后执行。

3.使用场景

适用于一组线程都执行完毕后,其他线程才能执行的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值