欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类CountDownLatch的使用

程序员文章站 2022-06-16 12:38:13
...

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.使用场景

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

相关标签: 多线程 java