CountDownLatch 是一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 CountDownLatch 使用一个指定 数 进行初始化,await方法一直阻塞,其他线程调用 countDown方法 直到当前计数达到零, 之后所有等待的线程都被释放,任何后续的await调用立即返回。 这是一次性的现象(计数无法重置)。如果您需要重置计数的版本,请考虑使用CyclicBarrier 。
主要方法
构造方法:CountDownLatch(int count)
构造一个使用给定计数初始化的CountDownLatch 。
参数:count 次数
void await() 方法:
导致当前线程等待直到锁存器倒计时到零,除非线程被中断。如果当前计数为零,则此方法立即返回
void countDown()
减少锁存器的计数,如果计数达到零,则释放所有等待线程。
代码示例
public class CountDownLatchDemo2 {
public static void main(String[] arr) throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1); // 开始信号
CountDownLatch doneSignal = new CountDownLatch(6); // 完成结束信号
// 来6个工人
for (int i = 0; i < 6; i++) {
new Thread(new Worker(startSignal, doneSignal)).start();
}
startSignal.countDown();// 老板这里喊:开干
doneSignal.await();// 老板等着 "工人们" 干完活
System.out.printf("%s 全部手工\n", Thread.currentThread().getName());
}
// 工人
public static class Worker implements Runnable {
final CountDownLatch startSignal;// 开始信号
final CountDownLatch doneSignal; // 完成结束信号
public Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
@Override
public void run() {
try {
startSignal.await();// 等着老板喊 "开始"
doSomeWork();
doneSignal.countDown();// 干完了 汇报
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void doSomeWork() { // 干活
System.out.printf(" %s 干活\n", Thread.currentThread().getName());
}
}
}
看源代码,CountDownLatch 内部写了个 继承自 AbstractQueuedSynchronizer 的 Sync 类,通过它来实现计数。