CountDownLatch的使用说明
CountDownLatch的使用说明
CountDownLatch
这个类正如名字所表达的意思,倒计时锁。它允许一个或多个线程等待直到这个锁倒计时完毕。
一个CountDownLatch
用给定的数字进行初始化,这个数字可以看成是倒计时的时长。await
方法会阻塞线程,直到由于countDown()
方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的线程调用await
方法,都会被立即返回,表示已经没有锁了。 这个倒计时锁是一次性的,计数无法重置。 如果想要可以重置计数的版本,请考虑使用CyclicBarrier
。
CountDownLatch
是一种通用的同步工具,可用于多种用途。 例如控制多个线程同时执行。又或者让所有线程都执行完毕后,才执行后续的代码。
构造方法
CountDownLatch
只有一个构造方法,这个构造方法传入一个整数,这个整数就是倒计时的计数。
常用方法
await
,这个方法用于阻塞线程。这个方法进行了重载,一个方法是空参的,一个是带过期时间参数的。这个方法只有三个情况下才会返回true,如下所示:
- 记数变成0
- 线程被中断
- 过期(这个情况只在有过期的方法才生效)
countDown
方法用于减少计数,每次减一。
getCount
方法用于返回当前的计数。
使用示例
package com.wangguitang.freedom.interview.java.concurrent;
import org.junit.jupiter.api.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 倒计时锁的测试
*
* @author freedom wang
* @date 2021-04-07 23:18:33
*/
public class CountDownLatchTest {
/**
* 模拟多个线程同时执行的场景
*
* @author freedom wang
* @date 2021-04-07 23:32:28
*/
@Test
public void test1(){
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 10; i++) {
executorService.submit(()->{
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis());
});
}
countDownLatch.countDown();
}
/**
* 模拟所有线程执行完成后执行的场景
*
* @author freedom wang
* @date 2021-04-07 23:40:15
*/
@Test
public void test2(){
int threadCount = 10;
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
executorService.submit(()->{
System.out.println("执行线程逻辑");
countDownLatch.countDown();
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有线程执行完后执行");
}
}