我们在使用多线程的过程中,可能有需要阻塞主线程让子线程先运行的需求,此时我们需要使用CountDownLatch这个类进行线程运行的控制
传统案例
1package com.atguigu.juc.MyLock;
2
3
4public class CountDownLatchDemo {
5 public static void main(String[] args) {
6 for (int i = 0; i < 6; i++) {
7 new Thread(() -> {
8 System.out.println(Thread.currentThread().getName() + "\t离开教室");
9 }, String.valueOf(i)).start();
10 }
11 System.out.println("班长关门了");
12 }
13}/**Output
140 离开教室
152 离开教室
161 离开教室
173 离开教室
184 离开教室
19班长关门了
205 离开教室
21*///~
我们会发现,这并不是我们期待的结果,我们想要的结果是主线程最后结束.
countDownLatch原理
countDownLatch主要有两个方法, 当一个多线程调用await方法时,这些线程会阻塞.其他线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因await方法阻塞的线程会被唤醒
CountDownLatch修改优化
1package com.atguigu.juc.MyLock;
2
3import java.util.concurrent.CountDownLatch;
4
5public class CountDownLatchDemo {
6 public static void main(String[] args) throws InterruptedException {
7 CountDownLatch countDownLatch = new CountDownLatch(6);
8 for (int i = 0; i < 6; i++) {
9 new Thread(() -> {
10 System.out.println(Thread.currentThread().getName() + "\t离开教室");
11 countDownLatch.countDown();
12 }, String.valueOf(i)).start();
13 }
14 // 当countDownLatch计数大于0时,线程被阻塞
15 countDownLatch.await();
16 System.out.println("班长关门了");
17 }
18}/**Output
190 离开教室
201 离开教室
212 离开教室
223 离开教室
234 离开教室
245 离开教室
25班长关门了
26*///~
通过使用CountDownLatch
,