- JUC大三常用的辅助类
CountDownLatch
CountDownLatch是用来计数的 是一个减法计数器
允许一个或者多个线程等待直到在其他线程中执行的一组操作完成的同步操作
它主要有两个方法
//通过new直接创建 需要一个参数:总数 CountDownLatch countDownLatch = new CountDownLatch(5); //倒数-1 countDownLatch.countDown(); //等待计数器归零,然后再向下执行 需要抛异常 countDownLatch.await();
例子:5个线程执行,等全部执行完了,可以进行关闭
首先看下没有执行等待的结果 发现不进行等待,每次线程还没走完,就被关在外面了
package com.wyh.JUCUtil; import java.util.concurrent.CountDownLatch; /** * @program: JUC * @description: 计数器 减 * @author: 魏一鹤 * @createDate: 2022-02-18 19:53 **/ //CountDownLatch本质是减法一个计数器 public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { //创建CountDownLatch 需要传递一个参数 总数 //必须要执行任务的时候 再使用! CountDownLatch countDownLatch = new CountDownLatch(5); //5个线程 for (int i = 1; i <= 5; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName() + "走了"); countDownLatch.countDown(); //倒数-1 },String.valueOf(i)).start(); } System.out.println("关门"); } }
1走了
关门
3走了
2走了
5走了
4走了
然后是进行等待的结果 发现如我们想要的一样,每次只有线程走完 才会进行关闭,不会出现线程没走完进行关闭的情况
package com.wyh.JUCUtil; import java.util.concurrent.CountDownLatch; /** * @program: JUC * @description: 计数器 减 * @author: 魏一鹤 * @createDate: 2022-02-18 19:53 **/ //CountDownLatch本质是一个减法计数器 public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { //创建CountDownLatch 需要传递一个参数 总数 //必须要执行任务的时候 再使用! CountDownLatch countDownLatch = new CountDownLatch(5); //5个线程 for (int i = 1; i <= 5; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName() + "走了"); countDownLatch.countDown(); //倒数-1 },String.valueOf(i)).start(); } //等待计数器归零,然后再向下执行 需要抛异常 countDownLatch.await(); System.out.println("关门"); } }
1走了
2走了
3走了
5走了
4走了
关门
原理:
首先需要知道 countDownLatch主要使用两个方法
1 countDownLatch.countDown(); //倒数-1 2 countDownLatch.await(); //等待计数器归零,然后再向下执行 需要抛异常
每次有线程调用countDown()方法,就会使数量-1,调用这个方法是不会阻塞的,假设计数器变为0,那么await()方法就会被唤醒,继续执行