背景:
- CountDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue。
- 存在于java.util.cucurrent包下。
概念
- CountDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
- 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。
源码
- CountDownLatch类中只提供了一个构造器:
1 | //参数count为计数值 |
- 类中有三个方法是最重要的:
1 | //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行 |
示例
- 普通示例:
1 | public class CountDownLatchTest { |
- 结果集:
1 | 主线程开始执行…… …… |
- 模拟并发示例:
1 | public class Parallellimit { |
- 结果集:
1 | thread counts = 9 |
CountDownLatch和CyclicBarrier区别:
- CountDownLatch是一个计数器,线程完成一个记录一个,计数器递减,只能只用一次
- CyclicBarrier的计数器更像一个阀门,需要所有线程都到达,然后继续执行,计数器递增,提供reset功能,可以多次使用