CountDownLatch
使用场景: 多个子线程都执行成功后, 主线程停止阻塞, 进入可运行状态.
构造方法需要执行一个数值, 当调用 countDown()
一次, 数值 -1
可以使用 getCount()
获取当前的数值
CountDownLatch
常用方法
countDownLatch.countDown()
每调用一次,count - 1
countDownLatch.await()
一般用于主线程, 只有countDown()
调用次数与构造方法传入次数相等时, 即当前count
值为0
时,await()
就会自动解除等待状态, 不再阻塞, 进入运行状态
@Test
public void testCountDownLatch() throws InterruptedException {
// 指定倒数的次数
int count = 2;
// 构造好 countDownLatch, 指定 count 数量
CountDownLatch countDownLatch = new CountDownLatch(count);
// 当前计数器的值
System.out.println("未 countDown 前, count = " + countDownLatch.getCount());
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < count; i++) {
executorService.submit(() -> {
System.out.println("执行子线程耗时操作...");
ThreadUtils.sleepQuietly(1);
// // 子线程执行完耗时操作, 调用一次 countDown: 计数 - 1
countDownLatch.countDown();
});
}
// 进入等待状态, 等待其他线程执行的预期过程, 例如获取到返回值等
// 当 countDownLatch 的 count = 0 时, 不再阻塞
countDownLatch.await();
System.out.println("await() 后, count = " + countDownLatch.getCount());
}