写之前呢也看过别的技术博客大都是大讲CountDownLatch的概念 看完之后一头雾水不知道到底什么是重点,所以打算写一篇超简单不带概念的东西,看完就能用的玩意!
其实 CountDownLatch很简单就是你创建的时候给一个数量X 然后使用的时候每次调用方法X-1
当X=0执行下一步代码逻辑!就是这么简单
package com.common.example.JavaCore.juc;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Auther: Gz.
* @Date: 2019/2/25 14:36
* @Description:J.U.C 包下 CountDownLatch使用样例
*/
@Slf4j
public class CountDownLatchExample {
//线程数量
private static final int threadCount = 200;
public static void main(String[] args) throws InterruptedException {
//创建一个线程池
ExecutorService executorService = Executors.newCachedThreadPool();
//创建一个CountDownLatch 并且给200个线程数量
final CountDownLatch countDownLatch = new CountDownLatch(threadCount);
//循环
for(int i=0; i<threadCount;i++){
//给一个线程名称(生产中最好给一个有意义的名称)
final int threadNum = i;
//线程池调用
executorService.execute(()->{
try {
//业务逻辑方法
test(threadNum);
log.info("count:{}",countDownLatch.getCount());
} catch (InterruptedException e) {
log.error("exception",e);
}finally {
//执行完业务逻辑一定要执行 countDown方法 来-1
//如果未调用则无法执行 下方的await()方法
//内部使用CAS算法 调用CPU级别指令 安全高效
countDownLatch.countDown();
}
});
}
//当countDownLatch=0的时候执行以下方法
countDownLatch.await();
//如果忘记调用countDown()方法来减-1 或者逻辑执行时间比较久 也可以设置一个超时时间,超过这个时间一到会执行await()方法
//很简单就是加上俩参数一个 超时的时间 一个是时间单位
//countDownLatch.await(10, TimeUnit.MILLISECONDS);
log.info("finish");
//关闭线程
executorService.shutdown();
}
//模拟业务逻辑方法
private static void test(int threadNum) throws InterruptedException {
Thread.sleep(100);
log.info("{}",threadNum);
Thread.sleep(100);
}
}