Java 并发编程工具CountDownLatch
CountDownLatch
CountDownLatch 倒计时器,是一个非常实用的多线程控制工具类,通常用来控制线程等待,可以让线程等待直到计数器计数结束之后,再开始执行。
CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。
CountDownLatch 原理图
举个栗子,打个比方,火箭发射的时候,通过需要做很多的项目check,只有所有check项目均反馈OK的时候,才能点火发射,这种情形可以使用倒计时器完美实现
代码示例
package com.superhakce.algorithm.practice.concurrent;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Author: SuperHakce
* @Maintenance: author
* @Description: 倒计时器
* @Date: Create in 2018/11/21 17:49
*/
public class CountDownLatchDemo implements Runnable{
static final CountDownLatch countDownLatch = new CountDownLatch(10);
static final CountDownLatchDemo countDownLatchDemo = new CountDownLatchDemo();
@Override
public void run(){
try{
Thread.sleep(100L);
System.out.println(Thread.currentThread().getName() + " Complete! " + "countDownLatch'count is " +
countDownLatch.getCount());
countDownLatch.countDown();
}catch (InterruptedException e){
e.printStackTrace();
}
}
public static void main(String[] args){
ExecutorService exec = Executors.newFixedThreadPool(10);
for(int i = 0;i < 10;i ++){
exec.submit(countDownLatchDemo);
}
try {
countDownLatch.await();
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("EveryThing Is OK");
exec.shutdown();
}
}
CountDownLatch缺点
CountDownLatch倒计时器是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其进行设值,当CountDownLatch使用完毕后,它不能再次被使用。