并发控制工具类CountDownLatch、CyclicBarrier、Semaphore

并发控制工具类CountDownLatch、CyclicBarrier、Semaphore

1.CountDownLatch

可以使一个或多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 是多线程控制的一种工具,它被称为 门阀、 计数器或者闭锁。这个工具经常用来用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。
让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒,CountDownLatch主要有2个方法,当一个或多个线程调用await方法时,调用线程会被阻塞,其他线程调用countDown方法时计数器减一(调用countDown方法不会阻塞线程),当计数器的值变为0时,因为调用方法被阻塞的线程会被唤醒,继续执行
countDown方法时计数器减一
await 尝试唤醒,当计数器的值变为0时,才会被唤醒

实例:学生上自习,当学生走完后才能锁门

public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(10);for (int i = 0; i < 10; i++) {new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 上完自习离开");countDownLatch.countDown();},String.valueOf(i)).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t &&&&&&&&&&班长锁门");}
}

输出
0 上完自习离开
4 上完自习离开
3 上完自习离开
2 上完自习离开
1 上完自习离开 main
&&&&&&&&&&班长锁门

2.CyclicBarrier

N个线程相互等待,任何一个线程没有到达或完成时,所有的线程都必须互相等待。与CountDownLatch相反。必须要达到某个值才会被唤醒。
await():线程调用 await 方法通知 CyclicBarrier 本线程已经到达屏障
在这里插入图片描述
实例:集齐7颗龙珠召唤神龙

 public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{System.out.println("……召唤神龙……");});for (int i = 1; i <= 7; i++) {int finalI = i;new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 收集到:"+finalI+"颗龙珠");try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}},String.valueOf(i)).start();}}
}

我理解就是 cyclicBarrier.await();要被调够 创建CyclicBarrier 时设置的次数,才会真的触发 创建CyclicBarrier的内容

输出

1 收集到:1颗龙珠
5 收集到:5颗龙珠
3 收集到:3颗龙珠
7 收集到:7颗龙珠
2 收集到:2颗龙珠
6 收集到:6颗龙珠
4 收集到:4颗龙珠
……召唤神龙……

3.Semaphore

Semaphore
①多个共享资源的互斥使用
②并发线程数控制
(信号量)可以用来限制能同时访问共享资源的线程上限,它内部维护了一个许可的变量,也就是线程许可的数量


acquire() 表示阻塞并获取许可 tryAcquire() 方法在没有许可的情况下会立即返回 false,要获取许可的线程不会阻 塞
release() 表示释放许可 int availablePermits():返回此信号量中当前可用的许可证数。 int
getQueueLength():返回正在等待获取许可证的线程数。 boolean
hasQueuedThreads():是否有线程正在等待获取许可证。 void reducePermit(int reduction):减少
reduction个许可证 Collection getQueuedThreads():返回所有等待获取许可证的线程集合

在这里插入图片描述

实例:停车场抢车位

public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore = new Semaphore(3);for (int i = 1; i <=6 ; i++) {new Thread(()->{try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t 抢到车位");TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName()+"\t 停车3秒后离开");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}},String.valueOf(i)).start();}}
}

输出
1 抢到车位
3 抢到车位
2 抢到车位
1 停车3秒后离开
3 停车3秒后离开
4 抢到车位
2 停车3秒后离开
5 抢到车位
6 抢到车位
4 停车3秒后离开
6 停车3秒后离开
5 停车3秒后离开

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为gre隧道全部跑静态路由

最终实现&#xff1a; 1、pc1能用nat上网ping能pc3 2、pc1能通过gre访问pc2 3、全部用静态路由做&#xff0c;没有用ospf&#xff0c;如果要用ospf&#xff0c;那么两边除了路由器上跑ospf&#xff0c;核心交换机也得用ospf r2配置&#xff1a; acl number 3000 rule 5 deny…

NVIDIA NCCL 源码学习(十二)- double binary tree

上节我们以ring allreduce为例看到了集合通信的过程&#xff0c;但是随着训练任务中使用的gpu个数的扩展&#xff0c;ring allreduce的延迟会线性增长&#xff0c;为了解决这个问题&#xff0c;NCCL引入了tree算法&#xff0c;即double binary tree。 double binary tree 朴素…

Qt下普通成员函数和静态成员函数作为回调函数的实现(替代信号与槽)

文章目录 前言一、使用信号与槽二、什么是回调函数三、使用普通成员函数作为回调函数四、使用静态成员函数作为回调函数五、示例完整代码总结 前言 在Qt中&#xff0c;使用信号与槽来实现不同对象之间的通信是非常方便的&#xff0c;这也是Qt框架中引以为傲的一项机制&#xf…

NVMe介绍

NVMe介绍 1 概述2 操作原理2.1 Queue基本原理2.2 Admin与I/O Queue2.3 Submission与Completion Queue2.4 Submission与Completion Queue对应关系 3 多路径I/O和命名空间共享3.1 1Port1Controller3.2 1Port2Controller3.3 2Port2Controller3.4 SR-IOV 本文属于《 NVMe协议基础系…

钓鱼与木马实践(仅供参考不可实践)

声明:内容仅供学习&#xff0c;请勿违法使用&#xff0c;违者后果自负 一.部署云服务器 购买一台云服务器,Windows&#xff08; 中文 &#xff09;版本即可 华为云官网&#xff1a;https://www.huaweicloud.com/ 登录后进入控制台购买完成后远程登录云服务器 二.部署WEB运行…

Linux内核编码规范

学习linux内核或者linux驱动的人应该先掌握内核编码规范&#xff0c;这样才能更好的驾驭linux内核、驱动。 下面就从这几个方面讲解一下linux内核编码规范。 注释风格、排版风格、头文件风格、变量定义、宏定义、函数 1 注释风格 1.1 注释的原则是有助于对程序的阅读和理解&…

一文了解提示工程(Prompt Engineering)

引言 在机器学习的世界里&#xff0c;有一句众所周知的话&#xff0c;“机器学习模型的好坏取决于您为其提供的训练数据。” 它指出了数据质量在您从这些算法中获得的结果中发挥的关键作用。 在使用生成式 AI 模型时&#xff0c;这一想法也很重要 - 无论它们生成文本、代码还…

第一次记录QPSK,BSPK,MPSK,QAM—MATLAB实现

最近有偶然的机会学习了一次QPSK防止以后忘记又得找资料&#xff0c;这里就详细的记录一下 基于 QPSK 的通信系统如图 1 所示&#xff0c;QPSK 调制是目前最常用的一种卫星数字和数 字集群信号调制方式&#xff0c;它具有较高的频谱利用率、较强的抗干扰性、在电路上实现也较为…

dotnet命令创建C#项目,VSCode打开

在命令行中创建项目并运行 1.首先安装.net 下载地址:.NET | 构建。测试。部署。 2.在 cmd 控制台输入 dotnet --vesion 检查版本号是否正常 3.我用git bash环境输入命令创建项目 // 创建文件夹 mkdir MyVSCode // 进入该文件夹 cd MyVSCode/ // 创建控制台项目 dotnet …

华为Harmony——ArkTs语言

文章目录 一、简单示例二、声明式UI描述创建组件无参有参数 配置属性配置事件配置子组件 三、自定义组件基本用法基本结构成员函数/变量 一、简单示例 我们以一个具体的示例来说明ArkTS的基本组成。如下图所示&#xff0c;当开发者点击按钮时&#xff0c;文本内容从“Hello Wo…

css 实现满屏升空的气球动画

最终实现效果 demo放在最后了。。。。 问题一 怎么实现满屏气球&#xff1f;简单理解就是多个气球的合并&#xff0c;难道要写多个盒子吗&#xff1f;确实是这样子&#xff0c;但可以有更好的办法&#xff0c;其实就是通过原生操作多个盒子生成&#xff0c;所以只需要实现一个…

【接口测试】如何定位BUG的产生原因

我们从在日常功能测试过程中对UI的每一次操作说白了就是对一个或者多个接口的一次调用&#xff0c;接口的返回的内容(移动端一般为json)经过前端代码的处理最终展示在页面上。http接口是离我们最近的一层接口&#xff0c;web端和移动端所展示的数据就来自于这层&#xff0c;那么…