概述
CountDownLatch 是 JAVA 提供在 java.util.concurrent 包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个 count 计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数器,CountDownLatch 通过构造函数传入一个初始计数值,调用者可以通过调用 CounDownLatch 对象的 countDown() 方法,来使计数减 1 ;如果调用对象上的 await() 方法,那么调用者就会一直阻塞在这里,直到别人通过 countDown() 方法,将计数减到 0 ,才可以继续执行。
API
# 调用 await 线程会被挂起,直到 count 计数值为 0 才继续执行
public void await() throws InterruptedException {}
# 和 await() 类似,只不过当等待时间后如果 count 还没变为0就继续执行。
public boolean await(long timeout, TimeUnit unit)throws InterruptedException {}
# count 计数值减一
public void countDown() { }
使用
- 确保某个计算在其需要的所有资源都被初始化之后才继续执行。
- 确保某个服务在其依赖的所有其他服务都已启动后才启动。
- 等待知道某个操作的所有者都就绪在继续执行。
public class CountDownLatchTest {
private static CountDownLatch countDownLatch = null;
private static final int THREAD_NUMBER = 3;
public static void main(String[] args) {
countDownLatch = new CountDownLatch(THREAD_NUMBER);
//线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(THREAD_NUMBER);
//执行线程
fixedThreadPool.execute(new CustomRunnable("test 1"));
fixedThreadPool.execute(new CustomRunnable("test 2"));
fixedThreadPool.execute(new CustomRunnable("test 3"));
System.out.println("等待3个子线程执行完毕...");
try {
countDownLatch.await();
System.out.println("子线程已经执行完毕继续执行主线程");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static class CustomRunnable implements Runnable {
public void run() {
try {
Thread.sleep(1000);
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}