JUC大三常用的辅助类

简介: JUC大三常用的辅助类

  1. 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()方法就会被唤醒,继续执行

目录
相关文章
|
存储 Java
「Java面试」工作3年竟然回答不出如何理解Reentrantlock实现原理
一个3 年工作经验的小伙伴,在面试的时候被这样一个问题。”谈谈你对ReentrantLock实现原理的理解“,他当时零零散散的说了一些。但好像没有说关键点。希望我分享一下我的理解。
92 0
|
3月前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。
|
1月前
|
Java 编译器
【Java】用一个动物王国的例子,讲清楚抽象类和接口
【Java】用一个动物王国的例子,讲清楚抽象类和接口
26 0
|
4月前
|
算法 安全 Java
Java小白教学—五千字带你了解多线程机制及线程安全问题
Java小白教学—五千字带你了解多线程机制及线程安全问题
|
6月前
|
Java
【JAVA杂货铺】一文带你走进面向对象编程|构造方法调用 | 代码块分类| 期末复习系列 | (中3)
【JAVA杂货铺】一文带你走进面向对象编程|构造方法调用 | 代码块分类| 期末复习系列 | (中3)
36 0
|
设计模式 安全 Java
通俗易懂,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
通俗易懂,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了
|
Java 程序员 数据库
重温经典《Thinking in java》第四版之第五章 初始化与清理(三十五)
重温经典《Thinking in java》第四版之第五章 初始化与清理(三十五)
54 0
|
Java
java学习第七天笔记-方法146-设计对象和使用
java学习第七天笔记-方法146-设计对象和使用
51 0
java学习第七天笔记-方法146-设计对象和使用
|
Java
java学习第六天笔记-方法129-综合联系-飞机票方法封装
java学习第六天笔记-方法129-综合联系-飞机票方法封装
59 0
java学习第六天笔记-方法129-综合联系-飞机票方法封装