CountDownLatch 是采用一个计数器进行控制 一个或多个线程执行完后,再进行接下来的操作。CountDownLatch 会在创建的时候给一个初始值,在每一个线程执行完后会 执行一个 countDown(); 相当于减一的操作,等计数器值到0时,他表示线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
@Slf4j
public class CountDownLatchExample {
// 设置 线程的总数量
private final static int totalClient = 200;
public static void main(String[] args) throws InterruptedException {
//设置 CountDownLatch 总线程数为上面定义的数量
CountDownLatch countDownLatch = new CountDownLatch(totalClient);
//创建一个线程池
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i=0;i<totalClient;i++){
final int number = i ;
executorService.execute(() ->{
try{
add(number);
}catch (Exception e){
log.error("出错了 {}",e);
}finally {
// 在线程任务结束后 执行 countDown(),
countDownLatch.countDown();
}
});
}
//当计数器 为 0 后,将通过这里,执行下面的命令
countDownLatch.await();
log.info("上面的任务都执行完成了");
}
private static void add(int number){
log.info("这是第 {} 个线程",number);
}
}