CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。

集合点同步:CyclicBarrier

多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才能一起执行下一段任务.

场景:

和朋友组队去游玩,再爬山,在吃饭,再KTV

第一个人爬山到顶之后要等待其他的三个人也到顶再下山吃饭,

第一个人吃完饭之后要等待之后的三个人也吃晚饭,再去KTV

这四个人相当于四条线程,而这些任务就设定了一一个个的点,这种点称之为集合点.

CyclicBarrier就是在集合点同步.

CyclicBarrier和CountDownLatch很相似,但是CyclicBarrier有一个reset能回到初始状态, CountDownLatch不可以.

还有一个很明显的区别是, CyclicBarrier同一类线程之间相互等待.

CountDownLatch是其他类线程等待另一类线程来唤醒它们...

CyclicBarrierDemo.java

  1. import java.util.Random;
  2. import java.util.concurrent.BrokenBarrierException;
  3. import java.util.concurrent.CyclicBarrier;
  4. import java.util.concurrent.TimeUnit;
  5.  
  6. public class CyclicBarrierDemo {
  7.  
  8. public static void main(String[] args) {
  9. final CyclicBarrier cb = new CyclicBarrier(4);
  10.  
  11. for (int i = 0; i < 4; i++) {
  12.  
  13. new Thread(new Runnable() {
  14.  
  15. @Override
  16. public void run() {
  17.  
  18. try {
  19. System.out.println(Thread.currentThread().getName()+" :爬山。。。");
  20. TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
  21. System.out.println(Thread.currentThread().getName()+" :到达山顶了。。。");
  22. cb.await();//await 就是集合点 等待,直到计数器变为0为止
  23.  
  24. System.out.println(Thread.currentThread().getName()+" :吃饭。。。");
  25. TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
  26. System.out.println(Thread.currentThread().getName()+" :吃完饭了。。。");
  27. cb.await();//等待,直到计数器变为0为止
  28.  
  29. System.out.println(Thread.currentThread().getName()+" :KTV。。。");
  30. TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
  31. System.out.println(Thread.currentThread().getName()+" :唱完歌了。。。");
  32. cb.await();//等待,直到计数器变为0为止
  33.  
  34. System.out.println(Thread.currentThread().getName()+":回家");
  35.  
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. } catch (BrokenBarrierException e) {
  39. e.printStackTrace();
  40. }
  41.  
  42. }
  43. }).start();
  44. }
  45.  
  46. }
  47. }

运行结果:

  1. Thread-0 :爬山。。。
  2. Thread-2 :爬山。。。
  3. Thread-1 :爬山。。。
  4. Thread-3 :爬山。。。
  5. Thread-2 :到达山顶了。。。
  6. Thread-1 :到达山顶了。。。
  7. Thread-0 :到达山顶了。。。
  8. Thread-3 :到达山顶了。。。
  9. Thread-3 :吃饭。。。
  10. Thread-2 :吃饭。。。
  11. Thread-0 :吃饭。。。
  12. Thread-1 :吃饭。。。
  13. Thread-3 :吃完饭了。。。
  14. Thread-2 :吃完饭了。。。
  15. Thread-1 :吃完饭了。。。
  16. Thread-0 :吃完饭了。。。
  17. Thread-0 :KTV。。。
  18. Thread-2 :KTV。。。
  19. Thread-3 :KTV。。。
  20. Thread-1 :KTV。。。
  21. Thread-3 :唱完歌了。。。
  22. Thread-1 :唱完歌了。。。
  23. Thread-0 :唱完歌了。。。
  24. Thread-2 :唱完歌了。。。
  25. Thread-2:回家
  26. Thread-3:回家
  27. Thread-1:回家
  28. Thread-0:回家

线程同步辅助类CyclicBarrier的更多相关文章

  1. JAVA线程同步辅助类CyclicBarrier循环屏障

    CyclicBarrier是一个同步辅助类,主要作用是让一组线程互相等待,知道都到达一个公共障点,在一起走.在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrie ...

  2. JAVA线程同步辅助类CountDownLatch

    一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达 ...

  3. Java八个并发学习——线程同步工具CyclicBarrier

    本文是一篇文章对网络的研究摘要,感谢您的无私分享. CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量.当当中一个线程到达确定点,它会调用await() 方法来等待其它线 ...

  4. java并发之同步辅助类CyclicBarrier和CountDownLatch

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...

  5. JAVA线程同步辅助类Exchanger-交换

    可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为 Synchro ...

  6. 线程同步辅助类——Exchanger

    下面是java6中文API对Exchanger的解释: 能够在对中对元素进行配对和交换的线程的同步点.每一个线程将条目上的某个方法呈现给 exchange 方法.与伙伴线程进行匹配,而且在返回时接收其 ...

  7. java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)

    线程同步辅助类,主要学习两点: 1.上述几种同步辅助类的作用以及常用的方法 2.适用场景,如果有适当的场景可以用到,那无疑是最好的 semaphore(seməˌfôr) 含义 信号量就是可以声明多把 ...

  8. java并发编程JUC第十篇:CyclicBarrier线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  9. Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semaphore、Phaser)

    我在<JDK1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...

随机推荐

  1. java学习2打架代码编写

    在同一个包中的Player类 package work; public class Player { private String name; private int hp; private int ...

  2. .net升级到4.0之后,出现;System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798

    今天在做从Silverlight页中跳转到aspx页的时候,出现错误: 第一次跳转的时候就出现这个错误,然后在点跳转或者刷新这个错误页面,问题就没有了. 解决方案: 在C:\Program Files ...

  3. npp 文本编辑器 开源

    下载地址 https://notepad-plus-plus.org/download/v6.8.4.html

  4. JSTL安装与使用

    第一步:下载支持JSTL的文件.jakarta-taglibs-standard-1.1.2.zip 第二步:下载解压后的两个jar文件:standard.jar和jstl.jar文件拷贝到工程的\W ...

  5. 2.3.5使用原子类进行i++操作

    除了在i++操作时使用synchronized关键字实现同步外,还可以使用AtomicInteger原子类进行实现 原子操作时不可分割的整体,没有其他线程能够中断或检查正在原子操作的变量,一个原子类型 ...

  6. Lua 常用遍历

    b = {} , do b[i] = i end -- method one for i, v in pairs(b) do print (i, v) end -- method two for i, ...

  7. (转第二方案)在 ASP.NET 環境下使用 Memcached 快速上手指南

    转自:http://blog.miniasp.com/post/2010/01/27/Memcached-for-ASPNET-Quick-Start-Guide.aspx 之前一直想研究 Memca ...

  8. 【python-excel】Selenium+python自动化之读取Excel数据(xlrd)

    Selenium2+python自动化之读取Excel数据(xlrd) 转载地址:http://www.cnblogs.com/lingzeng86/p/6793398.html ·········· ...

  9. 距离LCA离线算法Tarjan + dfs + 并查集

    距离B - Distance in the Tree 还是普通的LCA但是要求的是两个节点之间的距离,学到了一些 一开始我想用带权并查集进行优化,但是LCA合并的过程晚于离线计算的过程,所以路径长度会 ...

  10. ubuntu apache linux

    在ubuntu下安装的apache, 很多配置文件都分开写了,需要了解一下各部分: http://blog.csdn.net/veizz/article/details/7410784 Ubuntu下 ...