系列九、JUC强大的辅助类

news/2024/5/20 6:51:02 标签: JUC

一、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.niftyadmin.cn/n/5197402.html

相关文章

求臻医学受邀参加第三届基因检测行业发展高峰论坛并斩获三项荣誉

2023年11月18日&#xff0c;备受瞩目的第三届基因检测行业发展高峰论坛暨年度评选活动颁奖典礼在广州圆满召开。作为基因检测领域的佼佼者&#xff0c;求臻医学应邀参加了此次高峰论坛并斩获了基因检测行业年度风云企业奖、基因检测行业最具投资价值奖、基因检测行业最佳产品奖…

软考的含金量如何?怎么备考?

软考的含金量&#xff0c;太香了&#xff01; 一张软考证书可以抵扣个税&#xff0c;一次性抵扣3600元个税&#xff1b; 一张软考证书可以帮助省去大额的中介费&#xff0c;在一线城市直接职称入户&#xff1b; 一张软考证书可以在招投标中加分&#xff0c;为企业增加中标的…

斯坦福机器学习 Lecture2 (假设函数、参数、样本等等术语,还有批量梯度下降法、随机梯度下降法 SGD 以及它们的相关推导,还有正态方程)

假设函数定义 假设函数&#xff0c;猜一个 x->y 的类型&#xff0c;比如 y ax b&#xff0c;随后监督学习的任务就是找到误差最低的 a 和 b 参数 有时候我们可以定义 x0 1&#xff0c;来让假设函数的整个表达式一致统一 如上图是机器学习中的一些术语 额外的符号&#xf…

通过css设置元素隐藏和显示

背景&#xff1a;鼠标悬浮时显示删除&#xff0c;放开后显示组件名 解决&#xff1a;通过display:none和display:block显示和隐藏元素&#xff1b; 使用 div p选择器选择当前div的下一个紧跟的p元素 <div v-if"!preview" class"name">{{propertyDa…

Python基础:面向对象编程(OOP)

在Python中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming,OOP)是一种编程范式&#xff0c;通过使用对象、类、继承、封装、多态等概念组织代码和数据。可能会涉及到的概念&#xff1a;   类&#xff08;Class&#xff09;&#xff1a;类是一个抽象的概念…

每天一点python——day74

#每天一点Python——74 #函数调用的参数传递&#xff1a;位置与关键字函数参数传递指的是函数调用时候的传递 一般有两种&#xff1a; 位置实参传递 关键字实参传递#位置实参传递 #我们昨天定义了一个函数 def jiafa(a,b):#我们定义了两个参数&#xff0c;a和b&#xff0c;他们…

Rapid chain

这篇文章中提到 Elastico 运行6个epoch就会退化到公式失败率高达 0.97 omnileger 在第一个epoch需要一个初始化的随机种子&#xff0c;来初始化 VRF。这需要 O ( n 2 ) O(n^2) O(n2) 的复杂度&#xff0c;并且OminLedger 需要通过轻节点驱动枷锁和解锁的过程&#xff0c;这户家…

DP1332E/DP1363F国产多协议NFC读写器芯片支持ISO15693/ISO18092

目录 ISO/IEC 15693与ISO/IEC 18092协议标准差异DP1363F与DP1332E对比共同点主要差异点 ISO/IEC 15693与ISO/IEC 18092协议标准差异 ISO/IEC 15693是用于近距离无线通信中的射频识别&#xff08;RFID&#xff09;技术的标准协议&#xff0c;它定义了与读写器之间的通信协议。这…