寫之前呢也看過別的技術博客大都是大講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);
}
}