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 ...
随机推荐
- asm-offset.h 生成
转自:https://blog.csdn.net/linglongqiongge/article/details/50008301 http://www.cnblogs.com/wendellyi/p ...
- CodeForce:732B-Cormen — The Best Friend Of a Man
传送门:http://codeforces.com/problemset/problem/732/B Cormen - The Best Friend Of a Man time limit per ...
- BZOJ 5215: [Lydsy2017省队十连测]商店购物
裸题 注意+特判 #include<cstdio> using namespace std; const int mod=1e9+7; int F[1000005],mi[10000005 ...
- luogu1939 【模板】矩阵加速(数列)
upd:现在推荐使用一个长度为 \(n\) 的一维向量.若状态矩阵 \(F\) 对下一时间的状态矩阵 \(F'\) 有影响,则 \(F'=FA\) 中的 转移矩阵 \(A\) 的赋值方法是: 若状态矩 ...
- ogre3D学习基础10 -- 键盘控制与鼠标控制(缓冲控制)
带缓冲的鼠标.键盘操作,这里的鼠标.按键事件会被各自的监听器捕获.其中OIS中定义的两个类MouseListener,KeyListener负责对事件的处理.我们需要使用这两个类的接口. 当一个键被按 ...
- monkey测试工具与常用的linux命令
Monkey测试工具 说明:monkey是一个安卓自带的命令行工具,可以模拟用户向应用发起一定的伪随机事件.主要用于对app进行稳定性测试与压力测试. 实现:首先需要安装一个ADB工具,安装完之后,需 ...
- 设计模式之单例模式 Singleton实现
饿汉式 饿汉式单例模式,static变量会在类装载时初始化,此时也不会涉及多个线程对象访问该对象的问题.虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题, 因此可以省略synchronized关 ...
- Learning Deconvolution Network for Semantic Segme小结
题目:Learning Deconvolution Network for Semantic Segmentation 作者:Hyeonwoo Noh, Seunghoon Hong, Bohyung ...
- iOS学习笔记32-iCloud入门
一.iCloud云服务 iCloud是苹果提供的云端服务,用户可以将通讯录.备忘录.邮件.照片.音乐.视频等备份到云服务器并在各个苹果设备间直接进行共享而无需关心数据同步问题,甚至即使你的设备丢失后在 ...
- 【bzoj1002】[FJOI2007]轮状病毒 矩阵树定理+高精度
题目描述 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病 ...