系列九、JUC强大的辅助类

news2024/11/15 18:29:59

一、CountDownLatch

1.1、概述

让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒

1.2、功能

        CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞,其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。

1.3、案例演示

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 17:30
 * @Description: CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞,
 *               其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。 
 * 需求:6个同学陆续离开教室后值班同学才可以关门
 */
public class CountDownLatchMainApp {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                try {
                    // 线程休眠(单位:毫秒)
                    try {
                        TimeUnit.MILLISECONDS.sleep(300);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "\t号同学离开教室!");
                    countDownLatch.countDown();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName() + "\t**************值班班长关门走人!");

    }

}

二、CicyleBarrier

2.1、概述

        CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,当一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活;
        线程进入屏障通过CyclicBarrier的await()方法;

2.2、案例代码

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 17:41
 * @Description: 需求:集齐7颗龙珠就可以召唤神龙
 * <p>
 * constructor CyclicBarrier(int parties, Runnable barrierAction)
 */
public class CyclicBarrierMainApp {

    private static final int NUMBER = 7;

    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {
            System.out.println("*****集齐7颗龙珠就可以召唤神龙");
        });

        for (int i = 1; i <= 7; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "\t 号七龙珠被收集!");
                try {
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }

}

三、Semaphore

3.1、概述

        Semaphore的中文意思是信号量,主要功能有2个,即:

        (1)用于多个共享资源的互斥使用;

        (2)用于并发线程数的控制;

3.2、案例代码

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 17:48
 * @Description:
 * 需求:一个停车场有三个车位,有6辆车来停车,只有当别的车停完车办完事情后才会空出车位
 */
public class SemaphoreMainApp {

    public static void main(String[] args) {
        // 模拟三个车位
        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                try {
                    /**
                     * 当一个线程调用acquire操作时,它要么成功获取信号量(信号量减1),要么一直等下去,直到有线程释放信号量或超时。
                     */
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "\t号司机抢到了车位!");
                    // 线程休眠(单位:秒)
                    try { TimeUnit.SECONDS.sleep(new Random().nextInt(5)); } catch (Exception e) {e.printStackTrace();}
                    System.out.println(Thread.currentThread().getName() + "\t号司机办完事情,离开车位!");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业实现员工聊天和转账行为的实时监管

如何解决企业营销团队的管理问题&#xff1f; 在当今竞争激烈的市场环境中&#xff0c;企业营销团队的管理显得尤为重要。营销团队是企业发展的重要支柱&#xff0c;然而&#xff0c;一些常见的问题如员工飞单、私单、辱骂删除客户、离职带走公司客户以及工作不认真、工作量无…

Java笔记-PrintWriter无文件或文件内容为空

代码是这样的&#xff1a; PrintWriter out new PrintWriter(fileName); out.println(object.getValue()); out.close(); 查了下这个类&#xff0c;出现问题不会报异常。 但可以用checkError()函数返回值&#xff0c;判断是否有错误。 如果发现无文件或者文件内容为空&#…

C# Onnx DIS高精度图像二类分割

目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/xuebinqin/DIS This is the repo for our new project Highly Accurate Dichotomous Image Segmentation 对应的paper是ECCV2022的一篇文章《Highly Accurate Dichotomous Imag…

猫罐头品牌排行榜盘点!猫罐头哪个牌子好?

很多猫主人会发现他们家的猫咪可能对猫粮感到腻了&#xff0c;或者猫咪平时不爱喝水&#xff0c;还有一些主人可能会注意到猫咪太瘦了&#xff0c;想尝试给它们添加一些猫罐头&#xff0c;但又不确定如何选择。目前市场上的猫罐头品牌众多&#xff0c;确实让人有些困惑。那么&a…

Cesium 问题:输出的 纬度 latitude 是 0

文章目录 问题分析问题 在坐标转换的时候,出现如下问题 分析 在检查代码后,发现我将转换之前的高度默认设置为了 0 ,因此没能正确转换 let positionsOnCircle = [];// 圆面边缘的点 let numPoints = 360; for (let i

OpenAI | 解雇奥特曼后 ChatGPT将何去何从

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 11 月 17 日,OpenAI 董事会突然宣布解雇联合创始人兼首席执行官 Sam Altman,原因是…

【计算机组成体系结构】存储系统基本概念

一、存储器的层次化结构 CPU无法直接与辅存传输数据&#xff0c;因为CPU的处理速度大于辅存的读写速度&#xff0c;如果直接交互会拖累CPU的速度。所以需要先把辅存中的数据写入主存再与CPU进行数据传输。 Cache&#xff0c;高速缓存在主存和CPU之间。存在Cache的原因是主存的…

静态文件鉴权

​ 静态文件鉴权的解决方案 背景介绍 XX业务系统作为BXX业务系统的孪生姐妹系统&#xff0c;是对BXX受理业务的强力补充系统&#xff0c;他允许操作员拿着IPAD&#xff0c;和客户约定地点上门受理业务。 因一些业务的受理&#xff0c;按照最新的业务规章制度&#xff0c;需…

React中封装echarts图表组件以及自适应窗口变化

文章目录 前言环境代码接口使用效果后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;…

二手车选购参考:Honda CB650R/CBR650R 2019~2023 国产价格享进口本田

本田好&#xff0c;本田妙&#xff0c;本田大法呱呱叫。本田的650系列在国内可以说是伤透了一批老车主的心&#xff0c;上路12万&#xff0c;3年现在还值个4万&#xff0c;搁谁也受不了&#xff0c;正好没什么太好的新闻写&#xff0c;今天就带大家来看看二手车选购参考&#x…

常见树种(贵州省):004杨树种类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、响叶杨…

Linux内核调试篇——获取内核函数地址的四种方法(一文解决)

在内核调试中&#xff0c;经常需要知道某个函数的地址&#xff0c;或者根据函数地址找到对应的函数&#xff0c;从而进行更深一步的debug。 下面介绍四种获取内核函数地址的方法&#xff1a; 1、System.map 在编译Linux内核时&#xff0c;会产生一个内核映像文件System.map&…

全志R128内存泄漏调试案例

内存泄露调试案例 问题背景 硬件&#xff1a;R128 软件&#xff1a;FreeRTOS rtplayer_test(Cedarx) AudioSystem 问题复现 复现步骤&#xff1a; rtplayer_test /data/boot.mp3串口输入"l", 循环播放串口输入"b" , 播放器后台执行 具体表现 rtpla…

软信天成:干货分享,如何实施云迁移策略!

当下&#xff0c;数据管理正在经历着一场时代的巨变。过去&#xff0c;本地数据库和数据仓库作为企业数据管理的重要手段一直为实现传统业务智能奠定基础。如今&#xff0c;随着云计算应用的迅速激增&#xff0c;越来越多的组织为把握机遇实现更高的业务敏捷度&#xff0c;准备…

项目交互-选择器交互

选择器交互 <div><el-select v-model"valueOne" placeholder"年级"><el-option v-for"item in optionsOne" :key"item.gradeId" :label"item.gradeName" :value"item.gradeId"></el-option&…

高并发分布式架构的演进之路

目录 单体架构 应用数据分离架构 应用数据集群架构 读写分离 / 主从分离架构 引⼊缓存⸺冷热分离架构 垂直分库 业务拆分-微服务 单体架构 一个系统初期&#xff0c;我们需要利⽤我们精⼲的技术团队&#xff0c;快速将业务系统投⼊市场进⾏检验&#xff0c;并且可以迅速…

安卓主板_MTK安卓一体机方案定制

安卓一体机主板集成多媒体解码、3G&#xff08;4G/5G可选&#xff09;模块&#xff0c;GPS&#xff0c;液晶驱动、WIFI、蓝牙、串口于一体&#xff0c;支持绝大部分当前流行的视频及图片格式解码。支持MIPI接口的1280*720分辨率的显示屏&#xff0c;最大支持1280*720P解码。大大…

非上市公司的财务报表可以找到吗?

企业财务报表 财务报表是反映企业或预算单位一定时期资金、利润状况的会计报表。我国财务报表的种类、格式、编报要求&#xff0c;均由统一的会计制度作出规定&#xff0c;要求企业定期编报。国营工业企业在报告期末应分别编报资金平衡表、专用基金及专用拨款表&#xff0c;基…

java中的抽象

1.当一个类中给出的信息不够全面时&#xff0c;&#xff08;比方说有无法确定的行为&#xff09;&#xff0c;它给出的信息不足以描绘出一个具体的对象&#xff0c;这时我们往往不会实例化该类&#xff0c;这种类就是抽象类。 2. 在Java中&#xff0c;我们通过在类前添加关键字…

怎样的一款嵌入式 IDE 才是各阶段嵌入式开发者所喜欢的?

怎样的一款嵌入式 IDE 才是各阶段嵌入式开发者所喜欢的? 1 一定要快&#xff0c;现在流行的VSCODE用起来是很爽&#xff0c;但是VSCODE的插件什么的&#xff0c;也很容易拖卡&#xff0c;更不要说source insight了&#xff0c;SI有一个致命的特点就是&#xff0c;某个时候会闪…