CountDownLatch和CyclicBarrier 特点比较
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp79
并发编程中的CountDownLatch和CyclicBarrier
继上篇文章 http://grefr.iteye.com/admin/blogs/2020812(CyclicBarrier介绍)
CountDownLatch和CyclicBarrier的用途:
两者主要用于多线程的并发执行。当一个线程需要等待另外一个或多个线程的执行时,就可以考虑用它俩。
CountDownLatch和CyclicBarrier的共同点:
- 两者的共同点是都具有await()方法,并且执行此方法会引起线程的阻塞,达到某种条件才能继续执行(这种条件也是两者的不同)。
- 还有一个共同点是其构造方法都接受一个int类型的参数,这个值作为计数用,达到该次数即释放等待的线程。
两者的不同点主要是以下几点:
- CountDownLatch是减计数方式,计数==0时释放所有等待的线程;CyclicBarrier是加计数方式,计数达到构造方法中参数指定的值时释放所有等待的线程。
- CountDownLatch当计数到0时,计数无法被重置;CyclicBarrier计数达到指定值时,计数置为0重新开始。
- CountDownLatch每次调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响;CyclicBarrier只有一个await()方法,调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞。
应用场景分析:
由于CountDownLatch有个countDown()方法并且countDown()不会引起阻塞,所以CountDownLatch可以应用于主线程等待所有子线程结束后再继续执行的情况。具体使用方式为new一个构造参数为subThread数目的CountDownLatch,启动所有子线程后主线程await(),在每个子线程的最后执行countDown(),这样当所有子线程执行完后计数减为0,主线程释放等待继续执行。比如赛跑,每个运动员看做一个子线程,裁判就是主线程,裁判发令(设置一个值为1的计数器,发令之前所有子线程await等待命令,裁判员发令让计数置为0,所有子线程同时开跑)所有运动员开跑后,需要等待所有人跑完再统计成绩(设置一个值为运动员数目的计数器,所有运动员开跑后裁判await被阻塞,每个运动员跑完的时候countDown()一下,所有运动员跑完计数达到0,裁判释放阻塞开始计分)。
由于CyclicBarrier计数达到指定后会重新循环使用,所以CyclicBarrier可以用在所有子线程之间互相等待多次的情形。比如团队旅游,一个团队通常分为几组,每组人走的路线可能不同,但都需要到达某一地点等待团队其它成员到达后才能进行下一站。
最新文章
- POJ2369 Permutations(置换的周期)
- git 学习笔记
- TortoiseSVN status cache占用CPU高
- RDIFramework.NET ━ 9.11 数据字典管理 ━ Web部分
- Visual Studio技巧之打造拥有自己标识的代码模板
- js取最小最大值--Math.min()、math.max()
- IFeatureCursor.Flush
- windows远程桌面连接树莓派
- Name control
- 三元运算和lambda表达式
- Android动态加载jar、apk的实现
- 小谈数据库Char、VarChar、NVarChar差异
- 在Scholarspace可视化交互式分析中遇到的几个问题及处理方法
- jquery奇怪的问题
- useradd 命令详解
- SpringBoot整合Spring Security使用Demo
- python中栈的单链表实现
- PgAgent安装、配置、运行
- (4.20)sql server中 len 与datalength 的区别
- ajax和iframe区别
热门文章
- 5.npm scripts 使用指南
- table表格中单击添加动态编辑框
- 生成二维码的js以及调用打印插件
- 编写一个矩形类,私有数据成员为矩形的长( len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。
- Spring思维导图(一)
- [Noi2008]假面舞会
- ASP.NET Core - 关于标签帮助器您值得了解的五点
- GDB教程
- MySQL登录汇总
- 理清JS数组、json、js对象的区别与联系