并发新构件之CountDownLatch

CountDownLatch译为倒计时锁存器:JDK描述     ;允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。

CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier 。

典型用法1:某一线程运行前,等待其他N个线程运行完(countDown()方法被调用N次)。例如:司机(主线程)开车前,等待所有人(其他线程)上车,主线程在await(),其他线程执行coutndown()。

典型用法2:实现多个线程开始执行任务的最大并行性。例如 裁判(主线程)开枪,多个运动员(其他线程)开跑,主线程执行countDown(),其他线程await()在等待;

简单示例:

package com.houjun.current.newClassBank;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @Author: HouJun
 * @Date: 2019/10/17 8:50
 * @Description: 倒计时锁存器 简单例子,1实现多个线程开始执行任务的最大并行性。
 * @version: 1.0
 */
public class TestCountDownLatch1 {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService exec = Executors.newCachedThreadPool();
        CountDownLatch countDownLatch = new CountDownLatch(2);
        exec.execute(new Way(countDownLatch));
        exec.execute(new Way(countDownLatch));
        TimeUnit.SECONDS.sleep(10);
        countDownLatch.countDown();
        exec.shutdownNow();
    }
}
class Way implements Runnable{
    private CountDownLatch countDownLatch;

    public Way(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("开始跑步");
    }
}

 

posted @ 2019-10-17 10:59  侯上进  阅读(153)  评论(0编辑  收藏  举报