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 ...
随机推荐
- Nastya Studies Informatics CodeForces - 992B (大整数)
B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...
- SmartGit 30天评估期结束解决办法
smartgit 需要输入序列号解决办法: 1.找到路径: %APPDATA%\syntevo\SmartGit\<main-smartgit-version> 然后删除: setting ...
- holtek编程注意事项
1.holtek单片机中断服务函数中函数调用里的参数不能传递地址,不然程序就会跑飞 2.holtek单片机尽量不要函数嵌套很多层,嵌套过多,会导致单片机复位
- Android开发——减小APK大小
0. 前言 APK的大小对APP的加载速度,使用内存大小和消耗功率多少有一定影响.如何减小APK的大小对于Android开发者是一个永恒的话题. 查阅了很多相关资料,并将其做了删减以及总结.本文原创, ...
- ATM源码
package atm;//张秋亮,信1705-3,20173529 public class Account { private String accountID; private String a ...
- html5/css3常考面试题
一.HTML5 CSS3 CSS3有哪些新特性? 1. CSS3实现圆角(border-radius),阴影(box-shadow), 2. 对文字加特效(text-shadow.),线性渐变(gra ...
- JavaScript: 2015 年回顾与展望
链接:http://www.sitepoint.com/javascript-2015-review/ JavaScript经历了一个不平凡的一年.尽管到5月份已经20年了,关于JS的新闻.项目和兴趣 ...
- PHP协程是通过生成器实现的,这里测试了PHP生成器的一些特性
学习PHP的生成器,测试了一些特性.代码如下: function gen() { $name = (yield 'hello'); $nickname = (yield 'world'); yield ...
- BZOJ1879 [Sdoi2009]Bill的挑战 【状压dp】
题目 输入格式 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ 5,M ≤ 15,字符串长 ...
- java面试题之什么是线程ThreadLocal?作用是什么?
定义:线程局部变量是局限于线程内的变量,属于线程自身所有,不在多个线程间共享.java提供ThreadLocal类来支持线程局部变量,是一个实现线程安全的方式. 任何线程局部变量一旦在工作完成后没有释 ...