CountDownLatch是一个同步计数器,属于同步工具类。
CountDownLatch允许一个或多个线程阻塞,直到在其他线程中执行的一组操作完成为止。
CountDownLatch的不足
CountDownLatch被设计为只触发一次,计数值不能被重置。
如果需要重置计数值,可以使用CyclicBarrier。
CountDownLatch的用法
用法1:
将一个程序分为n个互相独立的可解决的任务。
当每个任务完成时,都要在这个锁存器上调用countDwon()方法,锁存器的计数会-1。
等待问题被解决的任务在这个锁存器上调用await()方法,这个任务会阻塞住,直到锁存器的计数为0,这个任务才继续向下执行。
案例:员工下班,保安最后锁门
代码示例:
public class CountDownLatchDemo {
private static final Integer THREAD_SIZE = 6;
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(THREAD_SIZE);
for (int i = 0; i < THREAD_SIZE; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t下班,离开公司");
// 每执行一次,计数器减1
countDownLatch.countDown();
}, String.valueOf(i + 1)).start();
}
try {
// 线程阻塞直到计数器为0
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "\t保安最后锁门");
}
}
执行结果:
1 下班,离开公司
4 下班,离开公司
3 下班,离开公司
2 下班,离开公司
5 下班,离开公司
6 下班,离开公司
main 保安最后锁门
用法2:
一组工作线程使用两个锁存器,第一个作为启动信号,第二个作为完成信号。