1、概念:
CountDownLatch是一个同步工具类,用于协调多个线程之间的同步。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。
当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
2、用法:
CountDownLatch典型用法:1、某一线程在开始运行前等待n个线程执行完毕。
将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1 countdownLatch.countDown(),当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒。
一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。
CountDownLatch典型用法:2、实现多个线程开始执行任务的最大并行性。
注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑。
做法是初始化一个共享的CountDownLatch(1),将其计算器初始化为1,多个线程在开始执行任务前首先countdownlatch.await(),当主线程调用countDown()时,计数器变为0,多个线程同时被唤醒。
3、案例演示:
package com.zhangwl.pg0928;

import org.junit.Test;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CountDownLatch;

/**
* @ClassName RunMain_01
* @Description 演示多线程的并发
* @Author zhangwl
* @Date 2019/9/28 10:25
* @Version 1.0
**/
public class RunMain_01 {

/*线程的数量*/
private static final int nums_thread = 1000;

/*同步计数器,实现并发 jdk5引入*/
private CountDownLatch countDownLatch = new CountDownLatch(nums_thread);

@Test
public void test_complicat() throws InterruptedException {
for (int i = 0; i < nums_thread; i++) {
Thread t = new Thread(() -> {
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
/*Lambda 表达式*/
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatNow = dateTimeFormatter.format(now);
System.out.println("线程 :" + Thread.currentThread().getName() + ",现在时刻,北京时间:" + formatNow);
});
t.start();
countDownLatch.countDown();
}
Thread.sleep(2000);
}

}

运行结果:

线程 :Thread-220,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-221,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-219,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-161,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-216,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-215,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-258,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-234,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-210,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-198,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-920,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-675,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-179,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-253,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-181,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-703,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-42,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-180,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-282,现在时刻,北京时间:2019-09-28 13:12:25
线程 :Thread-229,现在时刻,北京时间:2019-09-28 13:12:25

posted on 2019-09-28 10:45  it_zhangwl  阅读(171)  评论(0编辑  收藏  举报