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

目录
相关文章
|
8月前
|
安全 Java 数据库连接
【Java每日一题】——第二十八题:编程定义一个学生类汽车类Car
【Java每日一题】——第二十八题:编程定义一个学生类汽车类Car
|
5月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
70 7
|
2月前
JUC常用辅助类
CountDownLatch:设定一个数,当调用CountDown()时数量减一,当调用await() 时判断计数器是否为0,不为0就阻塞,直到计数器为0 CyclicBarrier:设定一个数,当调用await() 时判断计数器是否达到目标值,未达到就阻塞,直到计数器达到目标值 Semaphore:设定一个信号量,当调用acquire()时判断是否还有信号,有就信号量减一线程继续执行,没有就阻塞等待其他线程释放信号量,当调用release()时释放信号量,唤醒阻塞线程
|
4月前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
53 7
|
3月前
|
Java 编译器
【Java】用一个动物王国的例子,讲清楚抽象类和接口
【Java】用一个动物王国的例子,讲清楚抽象类和接口
45 0
|
6月前
|
算法 安全 Java
Java小白教学—五千字带你了解多线程机制及线程安全问题
Java小白教学—五千字带你了解多线程机制及线程安全问题
|
Java 程序员 编译器
中南林业科技大学Java实验报告九:内部类和异常类
中南林业科技大学Java实验报告九:内部类和异常类
398 0
|
C++
爱上c++的第四天(核心课程):类和对象--友元
爱上c++的第四天(核心课程):类和对象--友元
73 0
爱上c++的第四天(核心课程):类和对象--友元
|
Java
Java实验报告四,研究生薪资管理,创建一个抽象交通工具Vehicle类,经理与员工工资等实验
1、实验题目:类的继承和方法重写 定义一个基类作为父类,再定义一个继承父类的子类,在子类中重写父类的方法,使用super关键字调用父类的方法,测试其功能。
322 0