惭愧的要死,简历上写编程两年了,这个都木有见过。。。

以下文字都是出自http://janeky.iteye.com/blog/769965,只是我觉得作者写的最简单了,所以抄下来做笔记,后面可以翻阅

CyclicBarrier “一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

我们在学习CountDownLatch的时候就提到了CyclicBarrier。两者究竟有什么联系呢?引用[JCIP]中的描述“The key difference is that with a barrier, all the threads must come together at a barrier point at the same time in order to proceed. Latches are for waiting for events; barriers are for waiting for other threads。CyclicBarrier等待所有的线程一起完成后再执行某个动作。这个功能CountDownLatch也同样可以实现。但是CountDownLatch更多时候是在等待某个事件的发生。在CyclicBarrier中,所有的线程调用await方法,等待其他线程都执行完。

举一个很简单的例子, 今天晚上我们哥们4个去Happy。就互相通知了一下:晚上八点准时到xx酒吧门前集合,不见不散!。有个哥们住的近,早早就到了。有的事务繁忙,刚好踩点到了。无论怎样,先来的都不能独自行动,只能等待所有人

代码如下(参考了网上给的一些教程)

Java代码  
  1. import java.util.Random;
  2. import java.util.concurrent.BrokenBarrierException;
  3. import java.util.concurrent.CyclicBarrier;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. public class TestCyclicBarrier {
  7. public static void main(String[] args) {
  8. ExecutorService exec = Executors.newCachedThreadPool();
  9. final Random random=new Random();
  10. final CyclicBarrier barrier=new CyclicBarrier(4,new Runnable(){
  11. @Override
  12. public void run() {
  13. System.out.println("大家都到齐了,开始happy去");
  14. }});
  15. for(int i=0;i<4;i++){
  16. exec.execute(new Runnable(){
  17. @Override
  18. public void run() {
  19. try {
  20. Thread.sleep(random.nextInt(1000));
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. System.out.println(Thread.currentThread().getName()+"到了,其他哥们呢");
  25. try {
  26. barrier.await();//等待其他哥们
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. } catch (BrokenBarrierException e) {
  30. e.printStackTrace();
  31. }
  32. }});
  33. }
  34. exec.shutdown();
  35. }
  36. }

关于await方法要特别注意一下,它有可能在阻塞的过程中由于某些原因被中断

总结:CyclicBarrier就是一个栅栏,等待所有线程到达后再执行相关的操作。barrier 在释放等待线程后可以重用。

自己的理解:

与CountDownLatch 相比,这里可以复用吧。

不明觉厉的 CyclicBarrier相关推荐

  1. Java并发编程之CountDownLatch、CyclicBarrier和Semaphore

    前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...

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

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

  3. cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用

    原标题:Java并发编程之CyclicBarrier和线程池的使用 下面我们来讲述一下线程池和CyclicBarrier的使用和对比. 一.场景描述 有四个游戏玩爱好者玩游戏,游戏中有三个关卡,每一个 ...

  4. JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatc ...

  5. LeetCode 1195. Fizz Buzz Multithreaded--并发系列题目--Java 解法--AtomicInteger/CountDownLatch/CyclicBarrier

    题目地址:Fizz Buzz Multithreaded - LeetCode Write a program that outputs the string representation of nu ...

  6. LeetCode 1115. Print FooBar Alternately--多线程并发问题--Java解法--CyclicBarrier, synchronized, Semaphore 信号量

    此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址:Print FooB ...

  7. Java的CountDownLatch和CyclicBarrier的理解和区别

    CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...

  8. java并发编程同步器 Semaphore、CyclicBarrier、Exchanger、CountDownLatch

    为什么80%的码农都做不了架构师?>>>    一.Semaphore(信号量) 注解:信号量,其实就是定义一定的数量,只有释放一个才能进去下一个,其余都得进入等待状态.比如有2个洗 ...

  9. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...

最新文章

  1. 【原】使用Json作为Python和C#混合编程时对象转换的中间文件
  2. python tablewidget综合实例_python – 仅通过单击行标题选择QTableWidget行
  3. 如何控制并发和控制死锁(内含pb的处理要点)
  4. c语言对称矩阵的压缩存储_【数据结构】对称矩阵及对称矩阵的压缩存储
  5. Android开发之The application could not be installed: INSTALL_FAILED_VERSION_DOWNGRADE报错
  6. 一个简单的XML文档例子
  7. SPOJ MYQ10 (数位DP)
  8. 隧道凿岩机器人_隧道凿岩机器人的研制
  9. mysql卸载后重装失败_小筑教育BIM课堂-Revit100问 [第二期] | 软件卸载
  10. SpringBoot——@Scheduled的自定义周期性线程池解决任务延时执行问题
  11. 沃尔沃主动召回40万台车,只因一个罕见的问题
  12. linux环境变量设置和修改
  13. Shell 脚本语法
  14. 【18.40%】【codeforces 631D】Messenger
  15. 你真的懂网络安全行业吗?
  16. php 工作管理系统,TP-Admin
  17. 【Windows】Mathpix Snip-公式神器
  18. Linux下驱动开发
  19. 吉他“和弦”是什么?
  20. 基于机智云的智能家用窗户窗帘控制及物联网系统

热门文章

  1. VMware中CentOS7设置快捷键打开终端
  2. 数据挖掘之利用Python画相关性矩阵图
  3. 网页调用服务器视频代码,PPVOD视频系统调用视频地址播放的两种方式
  4. 动态规划0-1背包问题滚动数组
  5. PS网页设计教程X——在PS中设计摩登的博客布局
  6. 视频解码opencv、ffmpeg、decord三种方式速度对比
  7. 获取库中的所有字段的描述/获取某个表中所有字段方法
  8. 无人机数据处理—Pix4Dmapper解析
  9. 快速采集包牛牛上多个商品主图和视频素材
  10. 12.06 JavaScript