juc包下四大并发工具
juc.CountDownLatch 闭锁
一个线程在等待一组线程后再恢复执行
await()等待其他线程执行完毕
被等待线程执行完毕后计数器-1
如何知道其他线程执行完了?
计数器,若一组线程为,CountDown为5,减到0代表等待线程被全部执行完毕
一次性工具:当Countdown的值减到0的时候再也无法恢复
juc内部的代码都是lock体系来实现的
import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit;// 运动员线程 class CDLTask implements Runnable {private CountDownLatch countDownLatch;public CDLTask(CountDownLatch countDownLatch) {this.countDownLatch = countDownLatch;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"开始跑步");try {TimeUnit.SECONDS.sleep(1);System.out.println(Thread.currentThread().getName()+"到达终点");countDownLatch.countDown();} catch (InterruptedException e) {e.printStackTrace();}} }public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(4);CDLTask cdlTask = new CDLTask(countDownLatch);System.out.println("比赛开始...");new Thread(cdlTask,"运动员A").start();new Thread(cdlTask,"运动员B").start();new Thread(cdlTask,"运动员C").start();new Thread(cdlTask,"运动员D").start();// 等待所有线程都到达终点后再输出此语句 countDownLatch.await();System.out.println("比赛结束...");} }
juc.CyclicBarrier 循环栅栏
一组线程同时到达临界点后再恢复执行(先到达临界点的线程会阻塞,直到所有线程都到达临界点)
public CyclicBarrier(int parties, Runnable barrierAction)
当多个线程同时到达临界点时,
随机挑选一个线程执行barrierAction后再同时恢复执行
计数器的值可以恢复
await
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit;class CBTask implements Runnable {private CyclicBarrier cyclicBarrier;public CBTask(CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"正在写入数据...");try {TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕...");cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("所有线程均已写入完毕,继续恢复执行...");} } class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(4,() -> {System.out.println("当前线程为:"+Thread.currentThread().getName());});CBTask cbTask = new CBTask(cyclicBarrier);for (int i = 0; i < 4; i++) {new Thread(cbTask,"写线程"+(i+1)).start();}} }
juc.Exchanger 线程交换器 用于两个线程直线的数据交换,当Exchanger只有一个线程时,该线程会阻塞直到有别的线程调用exchange进入缓冲区,当前线程与新线程交换数据后同时恢复执行。
import java.util.concurrent.Exchanger; import java.util.concurrent.TimeUnit;class ExchangerDemo {public static void main(String[] args) {Exchanger<String> exchanger = new Exchanger<>();Thread girlThread = new Thread(() -> {try {String girl = exchanger.exchange("我喜欢你.....");System.out.println("女生说:"+girl);} catch (InterruptedException e) {e.printStackTrace();}});girlThread.start();Thread boyThread = new Thread(() -> {System.out.println("女神缓缓步入眼帘...");try {TimeUnit.SECONDS.sleep(1);String boy = exchanger.exchange("我喜欢你!");System.out.println("男生说:"+boy);} catch (InterruptedException e) {e.printStackTrace();}});boyThread.start();} }
juc.Semaphore 信号量 acquire() : 尝试占用一个信号量,失败的线程会阻塞直到有新的信号量 release() : 释放一个信号量 acquire(int n) : 尝试占用n个信号量,失败的线程会阻塞直到有新的信号量 release(int n) : 释放n个信号量
import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;class SemaphoreTask implements Runnable {private Semaphore semaphore;public SemaphoreTask(Semaphore semaphore) {this.semaphore = semaphore;}@Overridepublic void run() {try {semaphore.acquire(2);System.out.println(Thread.currentThread().getName()+"占用2台设备生产");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"生产完毕,释放设备");semaphore.release(2);} catch (InterruptedException e) {e.printStackTrace();}} } class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore = new Semaphore(5);SemaphoreTask task = new SemaphoreTask(semaphore);for (int i = 0; i < 8; i++) {new Thread(task,"工人"+(i+1)).start();}} }
转载于:https://www.cnblogs.com/hetaoyuan/p/11317029.html
juc包下四大并发工具相关推荐
- 多线程十 JUC包下的常用工具类
JUC包下的常用工具类 1. CountDownLatch-闭锁 2. CyclicBarrier-循环栅栏 3. Semaphore-信号量 4. Exchanger-线程数据交换器 这篇文章主要是 ...
- 6.juc包下的原子类AtomicInteger,AtomicLong等AtomicXXX介绍
在介绍juc中的原子类之前,先看看官方文档对java.util.concurrent.atomic包的介绍官方文档地址这里截取翻译之后的部分描述 1. 支持对单个变量进行无锁线程安全编程 2. 类的 ...
- JUC 常用 4 大并发工具类
欢迎关注方志朋的博客,回复"666"获面试宝典 什么是JUC? JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些东西 该包的位置位 ...
- 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等
CAS CAS 是一种乐观锁,syncronized 是一种悲观锁 AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchr ...
- 111 多线程JUC包下代码分析
2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列目录(共43篇) AtomicLongFieldUpdater:通过反射+CAS实现对传入对象的指定long ...
- JAVA中J.U.C 包下并发类的应用
文章目录 JUC包中的锁应用 Lock接口及ReentrantLock对象分析及应用? Condition接口对象分析与应用? ReadWriteLock接口及实现类分析与应用? StampedLoc ...
- 常用并发工具类(锁和线程间通信工具类)
常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...
- Java并发工具类:CountDownLatch、Semaphore、CyclicBarrier、Exchanger、Phaser
本文目录: 1.CountDownLatch(闭锁) 1.CountDownLatch 例子 2.CyclicBarrier(循环栅栏) 1.CyclicBarrier 例子 2.CountDownL ...
- Java并发工具CountDownLatch使用详解
本文目录 1.使用场景 2.使用介绍 3.使用案例 4. Thread.join()和CountDownLatch的区别 1.使用场景 通过使用 CountDownLatch可以使当前线程阻塞,等待其 ...
- 死磕Java并发:J.U.C之并发工具类:CountDownLatch
作者:chenssy 来源:Java技术驿站 在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有点儿相似. ...
最新文章
- 稚晖君自制机械臂,能给葡萄缝针的那种,成本1万块,网友:能把脑子开源一下?...
- arm linux远程桌面win7卡顿,主编解答win7系统使用远程桌面出现卡顿的恢复方法
- linux下ip协议(V4)的实现(三)
- 将字符串转为16进制数_Python 如何将字符串转为字典
- 语义分割——Spatial Pyramid Pooling (SPP)的作用
- 第二章 jQuery选择器
- 【深度学习】论文导读:GoogLeNet模型,Inception结构网络简化(Going deeper with convolutions)
- 苹果手机如何投屏到电脑【无线有线】
- 大数据的应用:九大领域
- sessionStorage 、localStorage 和 cookie
- 软件质量模型介绍ISO/IEC 9126和ISO/IEC 25010
- 2021全球程序员收入报告,字节跳动年薪274万元排第5!
- 《每日一题》——146. LRU 缓存|460. LFU 缓存
- 24点游戏---java编写
- java丐帮_JAVA集合 list set map
- win10如何手动强制关联默认文件打开方式应用
- 渗透测试工程师都需要什么工具呢?网络安全(三)
- android实时刷新
- DeFi基准利率今日为3.38%
- 酒店直播服务器系统,用ffmpeg+nginx服务器实现类似酒店视频直播系统
热门文章
- nodejs的简单爬虫
- 后端类型/状态/标识校验限定法
- SpringBoot 添加junit单元测试+Spring Boot 的测试类库
- 使PNG图片在IE6下透明(非背景图片)
- MySQL 优化技巧
- SpringCloud实战(四)Sentinel自定义降级异常实战
- presentation编程软件_编程难学?web相关知识,跟着淼哥学php全栈之路6
- koa2 引擎模版html,Koa2模板引擎Ejs使用教程
- el表达式判断不为空_Java学习72天---EL和JSTL表达式学完.
- python接口测试覆盖率统计_pytest文档57-计算单元测试代码覆盖率(pytest-cov)