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

CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。CyclicBarrier就象它名字的意思一样可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。

构造方法摘要
CyclicBarrier(int parties) 
创建一个新的CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在每个barrier上执行预定义的操作。

CyclicBarrier(int parties, Runnable barrierAction) 
创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行

方法摘要
int await() 
在所有参与者都已经在此barrier上调用await方法之前,将一直等待

int await(long timeout, TimeUnit unit) 
在所有参与者都已经在此屏障上调用 await 方法之前,将一直等待

int getNumberWaiting() 
返回当前在屏障处等待的参与者数目

int getParties() 
返回要求启动此 barrier 的参与者数目

boolean isBroken() 
查询此屏障是否处于损坏状态

void reset() 
将屏障重置为其初始状态

例一
public class RunnerTask implements Runnable
{
private final CyclicBarrier cyclicBarrier;
private String name;

public RunnerTask(CyclicBarrier cyclicBarrier, String name)
{
super();
this.name = name;
this.cyclicBarrier = cyclicBarrier;
}

public void run()
{
try
{
try
{
// 模拟等待
Thread.sleep(new Random().nextInt(5) * 1000);
System.out.println(name + "准备......");
cyclicBarrier.await();
System.out.println(name + "跑!");
}
catch (BrokenBarrierException e)
{
e.printStackTrace();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}

public class RunnerTest
{
public static void main(String[] args)
{
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for (int i = 1; i <= 5; i++)
{
new Thread(new RunnerTask(cyclicBarrier, "运动员" + i)).start();
}
}
}
运动员3准备......
运动员2准备......
运动员4准备......
运动员5准备......
运动员1准备......
运动员3跑!
运动员2跑!
运动员1跑!
运动员5跑!
运动员4跑!

例二
public class CyclicBarrierTest2
{
public static void main(String[] args)
{
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(3);
for (int i = 0; i < 3; i++)
{
Runnable runnable = new Runnable()
{
public void run()
{
try
{
Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName() 
+ "即将到达集合地点1,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();

Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName() 
+ "即将到达集合地点2,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();
Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName() 
+ "即将到达集合地点3,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();

}
catch (Exception e)
{
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
线程pool-1-thread-1即将到达集合地点1,当前已有0个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点1,当前已有1个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点1,当前已有2个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点2,当前已有0个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点2,当前已有1个已经到达,正在等候
线程pool-1-thread-1即将到达集合地点2,当前已有2个已经到达,正在等候
线程pool-1-thread-1即将到达集合地点3,当前已有0个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点3,当前已有1个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点3,当前已有2个已经到达,正在等候

例三
public class CyclicBarrierTest
{
public static void main(String[] args)
{
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(3, new Runnable()
{
public void run()
{
System.out.println("********我最先执行***********");
}
});
for (int i = 0; i < 3; i++)
{
Runnable runnable = new Runnable()
{
public void run()
{
try
{
Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName() 
+ "即将到达集合地点1,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();

Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName() 
+ "即将到达集合地点2,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();

Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程" + Thread.currentThread().getName() 
+ "即将到达集合地点3,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();
}
catch (Exception e)
{
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
线程pool-1-thread-1即将到达集合地点1,当前已有0个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点1,当前已有1个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点1,当前已有2个已经到达,正在等候
********我最先执行***********
线程pool-1-thread-1即将到达集合地点2,当前已有0个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点2,当前已有1个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点2,当前已有2个已经到达,正在等候
********我最先执行***********
线程pool-1-thread-1即将到达集合地点3,当前已有0个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点3,当前已有1个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点3,当前已有2个已经到达,正在等候
********我最先执行***********

原帖地址:http://www.cnblogs.com/liuling/p/2013-8-21-01.html

转载于:https://blog.51cto.com/woshixy/1430915

java.util.concurrent包(6)——CyclicBarrier使用相关推荐

  1. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

  2. java.util.concurrent 包下面的所有类

    java.util.concurrent 包下面的所有类 原子操作数类: java.util.concurrent.atomic.AtomicBoolean.class java.util.concu ...

  3. java.util.concurrent包

    本文是我们学院课程中名为Java Concurrency Essentials的一部分 . 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线程安全之 ...

  4. 【ArrayList】为什么java.util.concurrent 包里没有并发的ArrayList实现?

    2019独角兽企业重金招聘Python工程师标准>>> 为什么java.util.concurrent 包里没有并发的ArrayList实现? 问:JDK 5在java.util.c ...

  5. 高并发编程基础(java.util.concurrent包常见类基础)

    JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...

  6. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

  7. java concurrent 框架,java.util.concurrent 包下的 Synchronizer 框架

    看完书 java concurrency in practice 当然是想找点啥好玩的东东玩玩. 当看到了Doug Lee 的论文 << The java.util.concurrent ...

  8. jdk8中java.util.concurrent包分析

    并发框架分类 1. Executor相关类 Interfaces. Executor is a simple standardized interface for defining custom th ...

  9. java.util.concurrent包详细分析--转

    原文地址:http://blog.csdn.net/windsunmoon/article/details/36903901 概述 Java.util.concurrent 包含许多线程安全.测试良好 ...

最新文章

  1. 币圈“水逆”,暴跌与高危漏洞
  2. C/C++之数据类型
  3. javascript --- JSON字符串化
  4. 浅入浅出 MySQL 索引
  5. Palindrome Degree(hash的思想题)
  6. OC CoreData简单使用
  7. 为什要学习烹饪?学习烹饪迫在眉睫
  8. 电脑每次开机都要重新设置时间解决方法
  9. [升级失效]超星学术视频下载分析
  10. js将月份转换为英文简写的形式
  11. 使用Jquery+bootstrap无限级菜单树
  12. nginx 区分手机浏览器和pc浏览器
  13. python最小二乘法线性回归_python 分别用梯度下降法和最小二乘法求线性回归 | 学步园...
  14. python爬取整个网页,教师节不知道给老师送什么?
  15. 隐藏在发表的宏基因组文章背后故事,如何发掘和学习
  16. python图像融合算法_图像融合质量评价方法的python代码实现——MS-SSIM
  17. SQL必知必会(一)SQL基础篇
  18. Ubuntu 20.04 electron无法上网参考解决方法
  19. Flink 算子状态与键控状态总结
  20. 日本轮胎制造商纷纷提高轮胎价格

热门文章

  1. Windows 2000活动目录详解之基础篇
  2. 攻击者可提前检测到 Linux 内核的补丁并开发 exploit
  3. 一年三番五次修,卡巴斯基为何依然无法完美修复杀毒软件中的这些洞 (技术详情)?...
  4. SQL 批量修改订单号
  5. 前端开发学习之——dom ready和window onload的区别
  6. 百度云文章的链接地址抓取工具
  7. 不使用资源文件动态创建对话框的做法
  8. Ubuntu下使用VNC
  9. python压缩与读取.tar.bz2压缩包
  10. python switch语句的多种实现方法