JAVA-JUC-CountDownLatch使用方式

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



}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章