JUC:7_1三大辅助类:CountDownLatch原理及使用、线程减法计数器
什么是CountDownLatch?
允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier 。
A CountDownLatch是一种通用的同步工具,可用于多种用途。 一个CountDownLatch为一个计数的CountDownLatch用作一个简单的开/关锁存器,或者门:所有线程调用await在门口等待,直到被调用countDown()的线程打开。 一个CountDownLatch初始化N可以用来做一个线程等待,直到N个线程完成某项操作,或某些动作已经完成N次。
CountDownLatch一个有用的属性是,它不要求调用countDown线程等待计数到达零之前继续,它只是阻止任何线程通过await ,直到所有线程可以通过。
通俗的讲: CountDownLatch是一个减法计数器,你可以理解为线程是一个个员工,CountDownLatch是见证最后员工走后,负责善后的(比如你异步导出多个excel,并且要给个结果反馈,确保执行完的通知就可以这样做)。
代码
package juc.Test3;
import java.util.concurrent.CountDownLatch;
/**
* CountDownLatch是一个减法计数器(既然是计数器就有+有-)
* 再必须要执行使用的任务的时候,使用CountDownLatch
* 比如你异步导出多个excel,并且要给个结果反馈,确保执行完的通知就可以这样做
*/
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
//定义一个总数来计时
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 0; i < 10; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+"下班了。");
countDownLatch.countDown();//数量-1,不会阻塞的
}, "线程" + i).start();
}
countDownLatch.await();//等待计数器执行完毕,在向下执行
System.out.println("都走光了");
}
}
原理
countDownLatch.countDown();//数量-1,不会阻塞的
countDownLatch.await();//等待计数器执行完毕,在向下执行
每次有线程调用countDownLatch.countDown(),就会进行-1,假设计数器变为0,countDownLatch.await()就会唤醒,继续执行后续的代码,比如你异步导出多个excel,并且要给个结果反馈,确保执行完的通知就可以这样做