Cyclic是周期的意思,Barrier是关卡的意思。CyclicBarrier不仅有CountDownLatch的功能,还可以实现屏障等待,即阶段性同步。因此适用于,需要循环地实现线程一起做任务的目标。

CyclicBarrier允许一组线程相互等待,直到到达某个公共屏障点,如果某些进程需要实时地相互等待,就可以使用CyclicBarrier。CyclicBarrier的重点在于,任何一个线程没有完成任务,其他所有的线程都必须等待,即,同类相互等待。

CyclicBarrier的计数是加法操作。

new CyclicBarrier(5, new

Runnable(){})设置最大为5个同行者,当线程个数等于同行者数目时,即只有5个线程,则5个线程都执行了cbRef的await()方法后,才会走到run()方法内,然后每个方法再各自继续执行。否则这些线程彼此相互等待,一直阻塞。

当线程个数大于partier(同行者)数量时,凑齐同行者数量个线程的await后,就会走到run方法内,凑齐的方法也会各自继续执行。之后再次凑齐,会再执行一遍run方法,各自继续执行。从而实现分批进行。当循环执行时,到达屏障点一同执行的线程组合是可能是随机的。

CyclicBarrier具有屏障重置性。​当凑齐同行者数目后,使用getNumberWaiting()方法可以看到,等待数量变为0.再来一个同行者,等待数目就会变成n-1。

isBroken()方法查询此屏障是否处于损坏状态。​如果其中一个进程因为出现异常而中断,不会影响其他进程的执行和等待,但是,如果用Thread的interrupt()方法进行中断,则所有的线程都会抛出BrokenBarrierException异常。也就是说,CyclicBarrier类对现成的中断处理,会使用全有、或者全无的破坏模型。即,有一个线程因为超时或中断提前离开了屏障点,其他所有在屏障点等待的线程也会抛出异常并离开屏障点。

​await(long timeout,

TimeUnit unit)如果在指定时间内达到parties的数量则继续运行,否则抛出超时异常。

getParties()屏障对象的parties个数。

​​getNumberWaiting()在屏障处等待的线程个数。

reset()重置屏障。屏障被重置后,如果有线程在等待parties,会出现Broken异常。​

示例代码https://github.com/whitefancy/OJproblems/tree/master/javaconcurrent/cyclicbarrier

参考文档

《Java并发编程

核心方法与框架》(高洪岩)​​

​​

java barrier_Java并发类CyclicBarrier方法详解相关推荐

  1. java的String类源码详解

    java的String类源码详解 类的定义 public final class Stringimplements java.io.Serializable, Comparable<String ...

  2. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  3. Android之TelephonyManager类的方法详解

    林计钦-JAVA java技术群:127834248 博客园   首页   社区   新随笔   联系   订阅   管理 随笔-105  评论-24  文章-0  trackbacks-0 Andr ...

  4. 好程序员Java学习路线分享finalize()方法详解

    好程序员Java学习路线分享finalize()方法详解,前言,finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法.. fi ...

  5. java处理字符串Patter与Matcher类与其方法详解

    1.使用Patter与Matcher类 Pattern 类表示编译的正则表达式. 使用 Pattern 类的静态方法 compile() 获取 Pattern 类引用. 以下代码段用于创建 Patte ...

  6. Java中Unsafe类的原理详解与使用案例

    点击关注公众号,利用碎片时间学习 1 概述 本文基于JDK1.8. Unsafe类位于rt.jar包,Unsafe类提供了硬件级别的原子操作,类中的方法都是native方法,它们使用JNI的方式访问本 ...

  7. java semaphore 等待时间_一个java同步工具类Semaphore的详解

    Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了.这篇文章将对Semaphore的概念和使用进行一个详解. 一.概念理解 官方是这样 ...

  8. arraylist java 排序_Java ArrayList排序方法详解

    由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一.ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在 ...

  9. Java中的类(基础详解)

    文章目录 可以有多个类,但只能有一个public类 类 = 字段+方法 类的构造函数 我们没写构造函数的时候 如果我们自己写了构造函数 构造函数中 this 的使用 类的修饰符 / 控制符 第一类:= ...

最新文章

  1. HDU 2833 WuKong
  2. “羊贵妃”没走“牛魔王”又来?牛肉价格屡创新高
  3. c# 配置文件App.config操作类库
  4. 美萍系统服务器密码,从得到美萍计费管理专家管理员密码开始
  5. fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory
  6. 真正优秀的人是如何度过假期的
  7. FPGA-08FPGAVGA彩条显示
  8. linux 关闭系统自动更新,Linux下如何关闭自动更新
  9. 调和级数 java,再探π^2/6
  10. 织梦建站教程dedecms标签调用大全【经典教程】
  11. Bootstrap系列之表单(Forms)
  12. 根据身份证号回填信息
  13. golang中关于读写锁、互斥锁的理解
  14. Excel的二级级联以及多级级联的实现
  15. 实现企业微信引流的三大思路
  16. Quick-cocos2d-x 与COCOS2DX 区别
  17. 聊聊Dubbo3.0新特性之应用级服务发现
  18. Python3基础教程
  19. BloomFilter
  20. 操作系统--进程锁算法1(两个进程的锁)

热门文章

  1. ASP.NET Core 5 在IIS,Nginx,Caddy下的性能测试
  2. 使用 gRPCurl 调试.NET 5的gPRC服务
  3. 如何在 ASP.NET Core 中 自定义中间件
  4. 从零开始内建你的安全测试流程
  5. 面向接口编程,你考虑过性能吗?
  6. Magicodes.IE基础教程之导出Pdf
  7. 利用obfuscar对.NET应用进行混淆
  8. .NET CORE(C#) WPF简单菜单MVVM绑定
  9. Asp.Net Core 单元测试正确姿势
  10. NET Core 3.0 AutoFac替换内置DI的新姿势