详见: 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可以用在所有子线程之间互相等待多次的情形。比如团队旅游,一个团队通常分为几组,每组人走的路线可能不同,但都需要到达某一地点等待团队其它成员到达后才能进行下一站。

最新文章

  1. POJ2369 Permutations(置换的周期)
  2. git 学习笔记
  3. TortoiseSVN status cache占用CPU高
  4. RDIFramework.NET ━ 9.11 数据字典管理 ━ Web部分
  5. Visual Studio技巧之打造拥有自己标识的代码模板
  6. js取最小最大值--Math.min()、math.max()
  7. IFeatureCursor.Flush
  8. windows远程桌面连接树莓派
  9. Name control
  10. 三元运算和lambda表达式
  11. Android动态加载jar、apk的实现
  12. 小谈数据库Char、VarChar、NVarChar差异
  13. 在Scholarspace可视化交互式分析中遇到的几个问题及处理方法
  14. jquery奇怪的问题
  15. useradd 命令详解
  16. SpringBoot整合Spring Security使用Demo
  17. python中栈的单链表实现
  18. PgAgent安装、配置、运行
  19. (4.20)sql server中 len 与datalength 的区别
  20. ajax和iframe区别

热门文章

  1. 5.npm scripts 使用指南
  2. table表格中单击添加动态编辑框
  3. 生成二维码的js以及调用打印插件
  4. 编写一个矩形类,私有数据成员为矩形的长( len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。
  5. Spring思维导图(一)
  6. [Noi2008]假面舞会
  7. ASP.NET Core - 关于标签帮助器您值得了解的五点
  8. GDB教程
  9. MySQL登录汇总
  10. 理清JS数组、json、js对象的区别与联系