类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.使用场景
适用于一组线程都执行完毕后,其他线程才能执行的情况。
下一篇: WSL挂载移动硬盘U盘