JUC常用类解析

2023-11-16

CountDownLatch类

CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch有一个正数计数器,countDown()方法对计数器做减操作,await()方法等待计数器达到0。所有await的线程都会阻塞直到计数器为0或者等待线程中断或者超时。
流程如下:
在这里插入图片描述
TW线程调用计数器,线程就此阻塞,其他线程调减计数器的方法,待到TW定义的计数器都减完后,TW继续往下执行。
Demo:

public class DemoThread {

    static CountDownLatch countDownLatch=new CountDownLatch(3);

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        System.out.println("开始=============");
        new Thread(){
            @Override
            public void run() {
                System.out.println("线程1");
                countDownLatch.countDown();
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                System.out.println("线程2");
                try{
                    sleep(2000);
                }catch (Exception e){

                }
                countDownLatch.countDown();
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                System.out.println("线程3");
                //减少计数器
                countDownLatch.countDown();
            }
        }.start();

        for(int i=0;i<10;i++){
            System.out.println(i);
            if(i==5){
            //调用await()方法,阻塞主线程,等到其他线程减数器减为0,继续往下执行
                countDownLatch.await();
            }
        }

    }
}

CyclicBarrier类

CountDownLatch是阻塞主线程,等到计数器减少为0,主线程继续往下执行。CyclicBarrier也会定义计数器,但是这个计数器是阻塞计数器,即哪个线程调用计数器,就阻塞哪个线程,等计数器调用完后,阻塞的线程一起往下执行,示意图如下:
在这里插入图片描述
Demo:

public static void main(String[] args) throws InterruptedException, ExecutionException {
        CyclicBarrier cyclicBarrier=new CyclicBarrier(3);
        new Thread(){
            @Override
            public void run() {
                System.out.println("线程1");
                try {
                //阻塞计数器,阻塞线程,等待计数器为0往下执行线程
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("线程1往下执行");
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                System.out.println("线程2");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("线程2往下执行");
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                System.out.println("线程3");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("线程3往下执行");
            }
        }.start();
        System.out.println("主线程执行完毕");

    }

Semaphore类

Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。
在这里插入图片描述
常用方法和说明:

acquire(): 获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。 ​

acquire(int permits): 获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。

acquireUninterruptibly(): 获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。

tryAcquire(): 尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。 ​
tryAcquire(long timeout, TimeUnit unit) 尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。

release() : 释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。 ​ hasQueuedThreads() 等待队列里是否还存在等待线程。 ​

getQueueLength(): 获取等待队列里阻塞的线程数。

drainPermits(): 清空令牌把可用令牌数置为0,返回清空令牌的数量。

​ availablePermits(): 返回可用的令牌数量。

应用场景
通常用于那些资源有明确访问数量限制的场景,常用于限流 。

比如:数据库连接池,同时进行连接的线程有数量限制,连接不能超过一定的数量,当连接达到了限制数量后,后面的线程只能排队等前面的线程释放了数据库连接才能获得数据库连接。

Demo:
1.停车场容纳总停车量10。

2、当一辆车进入停车场后,显示牌的剩余车位数响应的减1.

3、每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。

4、停车场剩余车位不足时,车辆只能在外面等待。
代码如下:

 //停车场同时容纳的车辆10
    private  static  Semaphore semaphore=new Semaphore(10);public static void main(String[] args) {//模拟100辆车进入停车场
        for(int i=0;i<100;i++){Thread thread=new Thread(new Runnable() {
                public void run() {
                    try {
                        System.out.println("===="+Thread.currentThread().getName()+"来到停车场");
                        if(semaphore.availablePermits()==0){
                            System.out.println("车位不足,请耐心等待");
                        }
                        semaphore.acquire();//获取令牌尝试进入停车场
                        System.out.println(Thread.currentThread().getName()+"成功进入停车场");
                        Thread.sleep(new Random().nextInt(10000));//模拟车辆在停车场停留的时间
                        System.out.println(Thread.currentThread().getName()+"驶出停车场");
                        semaphore.release();//释放令牌,腾出停车场车位
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },i+"号车");
​
            thread.start();}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JUC常用类解析 的相关文章

随机推荐

  • POST请求常见错误及解决办法

    POST请求常见错误及解决办法 前后端分离 已经是web开发的主流 在前后端对接的过程中难免会碰到各式各样的问题 本文对近期项目中遇到的与 POST请求 有关的问题做了一个简要的汇总和分析 并列出了与之相关的解决办法 问题一 POST请求发
  • 区块链之java调用智能合约(二)部署智能合约

    前言 上一节 已经说过 如何的创建一个合约 如何编译合约 然后在java中调用 但是呢 这些还远远不够 那么还差哪些呢 现在就是如何将创建的智能合约部署的对应的共链 私链 测试链中了 需要部署后 才能真正的使用 现在就讲讲如何部署智能合约
  • linux下gcc的使用教程,Linux下GCC使用方法简介

    编译 第一步 是进行预编译 使用 E参数可以让GCC在预处理结束后停止编译过程 gcc E hello c o hello i 预处理的宏定义插入到hello i中 第二步 是将hello i编译为目标代码 这可以通过使用 c参数来完成 g
  • C++使用string的大数运算(6)模加模减模乘模幂

    本次项目目标 使用C 完成对于大数的相关运算 项目要点 1 大数指的是远超long long int的数据 2 将大数用矩阵进行存储 并通过矩阵实现运算 3 本人采用字符串进行存储 应注意char的特点 比如 char a 161 cout
  • 数据挖掘:银行评分卡制作——数据分箱、WOE、IV的意义

    在银行评分卡的项目中 通常都会需要把数据分箱 分箱后并不是对数据进行哑变量处理 而是用WOE值去替换 再放入模型中 学习的过程中会对这些操作有些疑问 比如 数据分箱有什么意义 WOE和IV值是干什么的 这里对这些数据处理的意义进行一个说明
  • [OpenAirInterface实战-6] :OAI在github中源代码的存放结构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 OpenAirInterface实战 6 OAI在github中源代码的存放结构 文火冰糖 王文兵 的博客 CSDN博客 目录 第1章 基本
  • Zookeeper的常见面试题

    1 Zookeeper 1 1 Zookeeper基本概念 Zookeeper作为一个优秀高效且可靠的分布式协调框架 ZooKeeper 在解决分布式数据一致性问题时并没有直接使用Paxos算法 而是专门定制了一致性协议叫做 ZAB Zoo
  • 芯片低功耗设计原则

    原则1 按照自顶向下 从架构级到门级 的方法 在不同设计层次上对功耗进行优化 设计层次越高 优化所能达到的效果越好 原则2 从系统级着眼全局 从细节处精打细算 从产品解决方案角度而不局限于芯片本身来进行功耗预算 并根据功耗的分析结果 优化系
  • xxl-job任务详解

    文章目录 任务管理 新增任务页面字段释义 1 1 路由策略 1 2 运行模式 BEAN模式 GLUE模式 1 3 阻塞处理策略 1 4 子任务ID 1 5 JobHandler 1 6 Cron 1 7 任务超时时间 任务操作 任务管理 新
  • labview与matlab接口,LabVIEW Comms与MATLAB®的互联接口

    为了复用现有的MATLAB 代码 LabVIEW Communications System Design Suite LabVIEW Comms 新增了MATLAB专用接口的功能 无线原型的开发者可使用已有的MATLAB函数或脚本 将其连
  • 图片占位符在线工具

    简介 在前端的开发中 有时需要加载各种尺寸的图片 而在开发阶段 这些真实的图片可能并未制作完成 因此 我们可以使用图片占位符工具生成假的图片进行替代 本文介绍一款十分灵活的图片占位符工具 您只需在调用API服务时修改图片尺寸参数就可以生成不
  • 机器学习入门教学——可解释性

    1 前言 近年来 机器学习模型被广泛地应用到现实生活中的一些重要领域 如面部识别 自动驾驶 语言处理和智慧医疗等 然而 机器学习模型就像一个黑盒子 给予一个输入 就能得到一个决策结果 但是我们并不知道模型是如何做决策的 因此 可解释性旨在帮
  • Struts2标签与jsp页面Java代码的值相互使用

    业务需求 Struts标签使用Jsp页面中的list的值 java代码使用Struts传来的值
  • 从ChatGPT与New Bing看程序员为什么要学习算法?

    文章目录 为什么要学习数据结构和算法 ChatGPT与NEW Bing 的回答 想要通关大厂面试 就不能让数据结构和算法拖了后腿 业务开发工程师 你真的愿意做一辈子CRUD boy吗 对编程还有追求 不想被行业淘汰 那就不要只会写凑合能用的
  • 51单片机PCA模块配置

    PCA模块是 可编程计数器阵列 的缩写 英文名称是 Programmable Counter Array 以下的说明均以SILICON LAB生产的C8051系列微型控制器为例 PCA包括1个16位 定时器 计数器 和5个 捕获 比较模块
  • 动态规划算法(背包问题)

    1 应用场景 背包问题 背包问题 有一个背包 容量为4磅 现有如下物品 1 要求达到的目标为装入的背包的总价值最大 并且重量不超出 2 要求装入的物品不能重复 2 动态规划算法介绍 1 动态规划 Dynamic Programming 算法
  • Python datetime模块中strptime和strftime的区别和使用方法

    strptime和strftime是两个比较容易搞混的函数 今天恰好用到 在这里做一个总结 strptime p表示parse 表示分析的意思 所以strptime是给定一个时间字符串和分析模式 返回一个时间对象 strftime f表示f
  • 【C++技能树】多态解析

    Halo 这里是Ppeua 平时主要更新C 数据结构算法 Linux与ROS 感兴趣就关注我bua 文章目录 0 多态的概念 0 1 多态的定义 1 重写 2 Final与Override 3 抽象类 4 多态中的内存分布 4 1虚表存在哪
  • 夜神模拟器-软件apk存放目录

    1 打开文件管理器 2 点sdcard 3 点tencent 4 点tassistant 5 点apk 6 我们下载好的apk就在这个位置 我们每安装好这个apk后 包将会被自动删除 所以图片中没有显示
  • JUC常用类解析

    CountDownLatch类 CountDownLatch 英文翻译为倒计时锁存器 是一个同步辅助类 在完成一组正在其他线程中执行的操作之前 它允许一个或多个线程一直等待 CountDownLatch有一个正数计数器 countDown