CountDownLatch、CyclicBarrier、Samephore浅谈三大机制
CountDownLatch、CyclieBarrier与SamePhore都可用来控制线程的执行,那么他们之间有什么区别呢
CountDownLatch
CountDowenlatch可以看成一个线程等待多个线程,当多个线程执行完毕后最后线程才会执行
话不多说。直接上代码
/**
* 一个线程等待多个线程,当多个线程都执行后
* 等待的线程才会执行
* @author chen
*
*/
public class CountDownLatchT { public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for(int i=0;i<5;i++) {
new Thread(()->{
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName());
},"线程"+i).start();
} countDownLatch.await();
System.out.println("main");
}
}
可以看到,刚开始给要等待的线程数设置个初始值,这里为5,意思是要等待5个线程,在线程里,要显式的时候countDownLatch的countDown方法表明
当前线程已经到了,将要等待的线程数减1,然后继续执行自己的代码。要等待的那个线程这里是main线程要使用countDownLatch的await方法进行等待。
当所有线程都到达后并且都执行countdown方法后等待线程才会被唤醒执行。所以这段代码的结果是前面的5个线程都执行完后主线程才会执行。
CyclicBarrier
如果说countdownlatch是执行减操作,每到一个线程就减1,直到减为0,被阻塞的线程才执行的话。那么CyclicBarrier就可以看作是加操作了。先上代码。
/**
* 所有线程通过cyclicBarrier的await方法阻塞,直到最后一个线程到达后
* 才唤醒所有线程,这时这些线程才能继续往下执行
* @author chen
*
*/
public class CyclicBarrierT { public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5); for(int i=0; i<5;i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"start");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"end");
},"线程"+i).start();
}
}
}
CyclicBarrier的工作原理是多个线程等一个线程,当一个线程到达的时候就使用await方法进入屏障,直到最后一个线程到达屏障的时候
屏障才会解除,所有到屏障的线程才会被唤醒继续往下执行。
SamePhore
SamePhore是信号量的意思,它的使用场景是多个线程使用有限个资源的情况。可以类比停车位,当汽车数大于停车位的时候一次只能有若干
辆汽车进去停车场,当汽车从停车场开出来的时候其他汽车才能进入停车场。
上代码
/**
* Semaphore限定一次只能有几个线程执行
* 线程进入前使用acquire获取执行权
* 结束后使用release释放执行权
* @author chen
*
*/
public class SemaPhoreT { public static void main(String[] args) { Semaphore semaphore = new Semaphore(2); for(int i=0;i<10;i++) {
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"启动了");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},"线程"+i).start();
} }
}
上面代码信号量定义为2,线程数为10,因此我们执行的时候可以看到每次只有2个线程在运行。
CountDownLatch、CyclicBarrier、Samephore浅谈三大机制的更多相关文章
- 浅谈 Attention 机制的理解
什么是注意力机制? 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制.例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目 ...
- 【C++】浅谈三大特性之一继承(一)
一,为什么要引入继承? 继承是一个非常自然的概念,现实世界中的许多事物也都是具有继承性的. 例如,爸爸继承爷爷的特性,儿子又继承爸爸的特性等都属于继承的范畴.下面是一个简单的汽车分类图: 在这个分类图 ...
- 浅谈fail-fast机制
fail-fast机制即为快速失败机制,个人认为是一种防护措施,在集合结构发生改变的时候,使尽全力抛出ConcurrentModificationException,所以该机制大部分用途都是用来检测B ...
- 【C#】:浅谈反射机制 【转】
http://blog.csdn.net/lianjiangwei/article/details/47207875 什么是反射? 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反 ...
- 【C++】浅谈三大特性之一继承(三)
四,派生类的六个默认成员函数 在继承关系里,如果我们没有显示的定义这六个成员函数,则编译系统会在适合场合为我们自动合成. 继承关系中构造函数和析构函数的调用顺序: class B { public: ...
- 【C++】浅谈三大特性之一继承(二)
三,继承方式&访问限定符 派生类可以继承基类中除了构造函数和析构函数之外的所有成员,但是这些成员的访问属性是由继承方式决定的. 不同的继承方式下基类成员在派生类中的访问属性: 举例说明: (1 ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- java反射机制浅谈
一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...
随机推荐
- LeetCode(165) Compare Version Numbers
题目 Compare two version numbers version1 and version2. If version1 > version2 return 1, if version ...
- poj:1985:Cow Marathon(求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5496 Accepted: 2685 Case ...
- 评估后Vista时代系统内核模式安全性
Windows Vista与之前的MS Windows版本(包括WindowsXPSP2)相比增加了很多的安全性.Vista新安全性的特征可以包括以下几个方面: 驱动签名 路径保护 内核模式代码完整性 ...
- java web开发基础实例(javabean+jsp+servlet+jdbc)
JavaBean:用于传递数据,拥有与数据相关的逻辑处理 JSP:从Model接收数据并生成HTML Servlet:接收HTTP请求并控制Model和View jdbc:用于配置环境 一.[建立数据 ...
- luogu2762 太空飞行计划问题
最大权闭合子图 参考这,胡伯涛论文. 10,8,6,3这个简单割对应的闭合子图是A1,B1,B2 输出路径时,最后一次层次图中,与源点相连的点即选做的实验,与汇点相连的点即选用的仪器. #includ ...
- 初试webpack打包
第一次接触webpack,学习了如何用webpack打包,记录一下过程. 1.在项目根目录安装webpack $ npm install webpack --save-dev 2.新建一个webpac ...
- [Cake] 2. dotnet 全局工具 cake
在上篇博客[Cake] 1. CI中的Cake中介绍了如何在CI中利用Cake来保持与CI/CD环境的解耦. 1. 简化cake的安装 当时dotnet 2.1还未正式发布,dotnet 还没有工具的 ...
- 2.新手必须掌握的Linux命令
第2章 新手必须掌握的Linux命令 章节简述: 本章首先介绍系统内核和Shell终端的关系与作用,然后介绍Bash解释器的4大优势并学习Linux命令的执行方法.经验丰富的运维人员可以通过合理地组合 ...
- MyBatis拦截器打印不带问号的完整sql语句方法
/* Preparing: SELECT * FROM tb_user WHERE id = ? AND user_name = ? 目标是打印:SELECT * FROM tb_user WHER ...
- bootstrap里的fileimput的小问题
fileinput 是bootstrap 里面一个非常好的插件 于是我很开心的开始的使用了 $("#file_upload").fileinput({ uploadUrl: &qu ...