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 }

运行结果:

Thread-0 :爬山。。。
Thread-2 :爬山。。。
Thread-1 :爬山。。。
Thread-3 :爬山。。。
Thread-2 :到达山顶了。。。
Thread-1 :到达山顶了。。。
Thread-0 :到达山顶了。。。
Thread-3 :到达山顶了。。。
Thread-3 :吃饭。。。
Thread-2 :吃饭。。。
Thread-0 :吃饭。。。
Thread-1 :吃饭。。。
Thread-3 :吃完饭了。。。
Thread-2 :吃完饭了。。。
Thread-1 :吃完饭了。。。
Thread-0 :吃完饭了。。。
Thread-0 :KTV。。。
Thread-2 :KTV。。。
Thread-3 :KTV。。。
Thread-1 :KTV。。。
Thread-3 :唱完歌了。。。
Thread-1 :唱完歌了。。。
Thread-0 :唱完歌了。。。
Thread-2 :唱完歌了。。。
Thread-2:回家
Thread-3:回家
Thread-1:回家
Thread-0:回家

本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6206265.html,如需转载请自行联系原作者

线程同步辅助类CyclicBarrier相关推荐

  1. Java7并发编程指南——第三章:线程同步辅助类

    Java7并发编程指南--第三章:线程同步辅助类 @(并发和IO流) Java7并发编程指南第三章线程同步辅助类 思维导图 项目代码 思维导图 项目代码 GitHub:Java7Concurrency ...

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

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

  3. 实现线程同步的几种方式

    在多线程中线程的执行顺序是依靠哪个线程先获得到CUP的执行权谁就先执行,虽然说可以通过线程的优先权进行设置,但是他只是获取CUP执行权的概率高点,但是也不一定必须先执行.在这种情况下如何保证线程按照一 ...

  4. java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...

    线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...

  5. java线程同步barrier_Java多线程同步工具类之CyclicBarrier

    一.CyclicBarrier使用 CyclicBarrier从字面上可以直接理解为线程运行的屏障,它可以让一组线程执行到一个共同的屏障点时被阻塞,直到最后一个线程执行到指定位置,你设置的执行线程就会 ...

  6. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  7. Java中的5种同步辅助类

    当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...

  8. Java并发编程之线程同步

    线程安全就是防止某个对象或者值在多个线程中被修改而导致的数据不一致问题,因此我们就需要通过同步机制保证在同一时刻只有一个线程能够访问到该对象或数据,修改数据完毕之后,再将最新数据同步到主存中,使得其他 ...

  9. CountDownLatch,同步辅助类

    public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 假设定义一个计数器为 5. 每 ...

最新文章

  1. 随记:kickstart远程批量无人值守安装linux
  2. using namspace std的使用
  3. 802.11(wi-fi)的PHY层(编码与调制方法)
  4. TLS实现代码段加密
  5. HTML --- 盒模型
  6. 微服务和其他常见架构
  7. HTTP Developer's Handbook Part V: Security 读书笔记
  8. 揭秘阿里中台!一文看懂阿里推荐业务的两大利器 | 赠书
  9. 房子值500万租金仅3500元,卖房拿利息和出租哪个合算?
  10. sar分辨率公式_对PAR DAR SAR的理解
  11. supermap大赛用得到python吗_Esri杯GIS大赛和SuperMap杯GIS大赛如何选择?
  12. 用c语言编程点亮7个二极管,单片机c语言编程二极管_单片机c语言编程_单片机c语言编程led...
  13. 偶极子阵列天线(带反射板)+单层天线罩
  14. 业务太忙,真的是没时间搞自动化理由吗?
  15. The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path
  16. 如何通过反向代理实现伪装IP?
  17. 如何使用Python在Excel中插入和删除行和列?你只需要这个工具
  18. 【记录4】【密码生成】前端自动生成8位由字母和数字组成的密码
  19. docx4j 对比word
  20. 智能家居项目(八)之树莓派+摄像头进行人脸识别

热门文章

  1. 计算机网络实验一:ping、ipconfig、netstat、tracert、arp命令
  2. python判断英文字母_Python判断两个单词的相似度
  3. BundleFusion
  4. linux一直用户身份验证失败,linux – chsh:PAM身份验证失败
  5. python大小写转换if_python代码实例大小写转换,首字母大写,去除特殊字符
  6. python怎么读取pdf为文本_python怎么读取pdf文本内容
  7. ubuntu 环境下调试mysql源码_【转】Ubuntu 16.04下 Mysql 5.7.17源码编译与安装
  8. 数据结构与算法(C++)– 堆排(Heap Sort)
  9. Scikit-Learn 机器学习笔记 -- 模型训练
  10. 【Python】pandas 分类数据处理大全(附代码)