JUC的常用辅助工具
CountDownLatch(减少计数)
原理:
CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。
其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),
当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行
代码: 题目:6个学生+班长在教室上自习,只有班长有钥匙锁门,班长只有等六个学生都走完才能锁门
package com.thekingqj;import java.util.concurrent.CountDownLatch;/*** CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。* 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),* 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。* */
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 0; i <6 ; i++) {final int temp=i;new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t"+temp+"离开教室");countDownLatch.countDown();}, String.valueOf(i)).start();}countDownLatch.await();System.out.println("班长离开教室");}
}
CyclicBarrier循环栅栏
原理:
字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,
让一组线程到达一个屏障(也可以叫同步点)时被阻塞,
直到最后一个线程到达屏障时,屏障才会开门,所有
被屏障拦截的线程才会继续干活。
线程进入屏障通过CyclicBarrier的await()方法。
样例:集齐七颗龙珠才能召唤神龙
package com.thekingqj;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/*** * CyclicBarrier* * 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,* * 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,* * 直到最后一个线程到达屏障时,屏障才会开门,所有* * 被屏障拦截的线程才会继续干活。* * 线程进入屏障通过CyclicBarrier的await()方法*/
public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(7, () -> {System.out.println("*******召唤神龙");});for (int i = 1; i <=7 ; i++) {final int temp=i;new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t第"+temp+"个龙珠已经收集到");try {barrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}, String.valueOf(i)).start();}}
}
Semaphore信号灯
原理:
在信号量上我们定义两种操作:
acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),
要么一直等下去,直到有线程释放信号量,或超时。
release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。
信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
非公平锁,意思就是可以耍流氓,谁抢到的算谁的。
代码:六部车抢三个车位
package com.thekingqj;import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore=new Semaphore(3);for (int i = 0; i <6 ; i++) {new Thread(() -> {boolean flag=false;try {semaphore.acquire();//获取信号量flag=true;System.out.println(Thread.currentThread().getName()+"\t"+"抢到车位");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"\t"+"离开车位");} catch (InterruptedException e) {e.printStackTrace();}finally {if(flag){semaphore.release();//释放当前信号量}}}, String.valueOf(i)).start();}}
}
JUC的常用辅助工具相关推荐
- 猿创征文|【开发工具-我打辅助的】2022软件开发常用辅助工具
总览 常说工欲善其事必先利其器,人力终归有限,而软件开发又是一个相当耗费时间和经历的过程,而简捷的开发辅助工具则能够大大提高我们软件工程师的开发效率. 必关注网站 国家信息安全漏洞库 官网:https ...
- 多线程总结-JUC中常用的工具类
本文只记录JUC中较常用到的一些工具类,只是列举其常见的使用方法,至于其实现原理,此处不做说明. CountDownLatch 一个同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行 ...
- iOS 开发常用辅助工具
工欲善其事,必先利其器.作为一个合格的iOS开发者,熟练的使用各种开发或辅助开发的工具也算是一项必备技能吧,下面是我整理的一些工具及其应用场景和使用方法. 文档浏览工具 - Dash 网络抓包工具 C ...
- 常用的自媒体工具有哪些?推荐4个常用辅助工具
我们做自媒体运营,想要快速的创作内容,提供文章的创作速度是我们的目标,我们别的大佬可以很快地就创作出一篇内容,而自己墨迹半天确出不了一个字呢?其实这关乎到创作技巧,下面小编就跟大家分享如何利用自媒体工 ...
- 落地好OKR的8大关键步骤及常用辅助工具
本篇文章将回答关于OKR的一些问题,比如:1.OKR是什么?2.OKR与KPI的本质区别:3.OKR实施的4步法与3大成功关键点:4.OKR 落地常用的5大管理软件:5.如何写好OKR,制定正确的OK ...
- 【工具总结】前端常用辅助工具
1.马克鳗 http://www.getmarkman.com/#/download-modal 设计稿标注,测量 2.CSS精灵 https://www.toptal.com/developers/ ...
- .NET 程序员十种常用辅助开发工具
.NET 程序员十种常用辅助开发工具 一: .NET 程序员十种工具 - Visual Studio Converter(转换器工具) Visual Studio .NET 项目转换器(参 ...
- 数据库学习笔记第三弹——MySQL常用的图形化管理辅助工具及相关问题(图文详解2022))
数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 文章目录 数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 1.MySQL常用的图形化管理 ...
- 社群运营中常用的辅助工具,口碑推荐这几款!
职场生活很残酷,大鱼吃小鱼,小鱼吃虾米,虾米卷铺盖走人,没有扎实的实力往往很容易被淘汰,所以作为每一个职场同学,要提高工作效率就得借助一些辅助工具,让复杂的事情简单化,简单的事情更加便捷化. 那么社群 ...
- 推荐个人常用的六个APP设计辅助工具
推荐个人常用的六个APP设计辅助工具 分享六个本人在学习和制作App设计时,经常使用到的辅助工具,非常实用,相信对UI设计的初学者一定非常有帮助. Eagle Eagle for mac 一个简单.高 ...
最新文章
- node建立博客系统遇到的问题,1,乱码。2,multer的使用错误。3使用session问题...
- ML近三年在CVPR比较流行被应用的技术有哪些?
- Google Maps API v2 android版本开发 国内手机不支持google play Service相关问题解决--图文教程
- 皮一皮:我是谁,我在哪里,我的爸爸是哪个?
- Cuda中Global memory中coalescing例程解释
- python中的format方法和int方法
- JavaScript中的String substring()方法和示例
- 【java】dubbo基础学习
- 关于 Hibernate 中的“脏数据”、“脏对象”
- python123安装教程_小白安装Python环境详细步骤!
- JAVA-上转型对象,下转型对象
- lua collectgarbage
- mysql清空数据库_mysql命令行快速清空数据库的方法
- 基于遗传算法的新安江模型参数优化率定(二)
- govendor使用及错误处理
- ios键盘遮挡输入框问题
- 微信屏蔽网址解决办法 怎么样才能让被微信屏蔽的网址正常访问
- 佐治亚大学计算机博士,美国佐治亚大学,光电专业,全奖博士招生
- 头文件里应该写些什么
- Cannot interpret feed_dict key as Tensor: Tensor Tensor(“keras_learning_phase:0“, shape=(),