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{
        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);
  }



}

你可能感兴趣的:(JAVA,JUC)