CountDownLatch

CountDownLatch

CountDownLatch是一个JUC包下的同步工具 计数器

作用是: 使一个或者多个线程等待其他线程完成后再执行

//构造一个用给定计数初始化的 CountDownLatch。
CountDownLatch(int count)
// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
void await()
// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
boolean await(long timeout, TimeUnit unit)
// 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
void countDown()
// 返回当前计数。
long getCount()
// 返回标识此锁存器及其状态的字符串。
String toString()

示例

public class CountDownLathTest {

// 每个线程去收集 1 颗龙珠
// 定义需要收集龙珠的目标数量
public static final int DRAGON_BALL_TOTAL_NUM = 7;

public static void main(String[] args) {

// 定义需要等待的线程数量
CountDownLatch countDownLatch = new CountDownLatch(DRAGON_BALL_TOTAL_NUM);

for (int i = 0; i < 7; i++) {
int index = i;
// 每个线程收集完一颗龙珠后, countDownlatch(减数板) - 1
new Thread(() -> {
System.out.println("收集到第 " + index + "号龙珠!");
countDownLatch.countDown();
}).start();
}

try {
// 只有当countDownlatch(减数板)数量减少为 0 时, 主线程才会被唤醒, 也就是 7 颗龙珠收集完毕
countDownLatch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

System.out.println("龙珠收集完毕!!! \n" + "召唤神龙!!");

}
}

由上述代码可见, CountDownLatch 通过计数定义了线程之间的同步关系

JUC包下所有同步工具离不开ASQ的框架(不得不感叹Doug Lea教授强大的抽象和设计)