一,介绍


​CyclicBarrier是一个保持多个线程共享同一个状态的工具类。

也就是说在多线程环境下,能够通过设定某一个状态来达到线程之间的同步。这个类有两个有參构造方法。各自是CyclicBarrier(int n)和CyclicBarrier(int n, Runnable r)。第一个构造方法的意思是指给这个类设置等待点到多少时才运行在run方法中调用await方法之后的操作;第二个构造器的Runnable能够看作一个等待点的狼烟,狼烟是什么,是一种信号。也就是说,在等待线程达到n这个数量之后,会開始运行run方法中调用await方法之后的代码,而在调用这些代码前,会先放狼烟,然后再运行那些代码。

这个类在多线程统计数据时还是非常实用的。可是要注意,假设你的线程数量总是达不到设置的n的数量,那么这时,操作将被堵塞,即await方法后面的代码总是不能运行。

二,样例

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; public class CyclicBarrrierTest {
static int count = 0; static List<Integer> data= Collections.synchronizedList(new ArrayList<Integer>());
public static void main(String[] args) {
//设置2个等待线程,存在两个等待线程时,计算集合中的何,然后再清除集合中的数据
CyclicBarrier cb = new CyclicBarrier(2, new Runnable() {
public void run() {
int sum = 0;
for(int i = 0; i < data.size(); i++) {
sum += data.get(i);
}
System.out.println("current sum is " + sum);
data.clear();
}
});
int n = 10;
for(int i =0 ; i< n; i++) {
new Thread(new CBThread(2, cb,data)).start(); //开启n个线程
}
} } class CBThread implements Runnable{
private int n;
private CyclicBarrier cb;
private List<Integer> data;
public CBThread(int n,CyclicBarrier cb,List<Integer> data) {
this.n = n;
this.cb = cb;
this.data = data;
} public void run() {
Random random = new Random();
// while(!done()) {
int n = random.nextInt(10);
data.add(n);
System.out.println(Thread.currentThread().getName() + " ======" + n + ", " + cb.getNumberWaiting());
try {
cb.await(); //await方法后面的代码总是在cb.getNumberWait等于n的时候才运行
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("走起......" + CyclicBarrrierTest.count);
// }
} private boolean done() {
return false;
}
}

CyclicBarrier分析与实例的更多相关文章

  1. rip路由协议 细节分析及实例配置【完整版】

    rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现 ...

  2. [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast

    [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast 0x00 摘要 本文将通过源码分析和实例讲解,带领大家熟悉Flink的广播变量机制. 0x01 业务需求 1. 场景需求 对黑 ...

  3. Java 23种设计模式详尽分析与实例解析之二--结构型模式

    Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...

  4. Java 23种设计模式详尽分析与实例解析之一--创建型模式

    面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...

  5. MD中bitmap源代码分析--状态机实例

    1. page_attrs的状态转换关系 之前说过,bitmap的优化核心是:bitmap设置后批量写入:bitmap延时清除.写bit用bitmap_statrwrite() + bitmap_un ...

  6. Java 23种设计模式详尽分析与实例解析之三--行为型模式

    Java设计模式 行为型模式 职责链模式 模式动机:职责链可以是一条直线.一个环或者一个树形结构.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理组织成一条链,并使请求链传递,由链上的处理者 ...

  7. Vector源码分析和实例应用

    1.Vector介绍 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口. Vector ...

  8. LinkedList源码分析和实例应用

    1. LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈.队列或者双端队列使用. LinkedList实现了Deque接口,即 ...

  9. ArrayList源码分析和实例应用

    1.ArrayList介绍 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAcces ...

随机推荐

  1. ADO.Net 之 数据库连接池(二)

    连接到数据库服务器通常由几个需要很长时间的步骤组成.必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事 ...

  2. Appium Python 五:元素定位

    总结 单个元素定位: driver.find_element_by_accessibility_id(id) driver.find_element_by_android_uiautomator(ui ...

  3. PHP 自学之路-----XML编程(Dom技术)

    上一节,讲了Xml文件基本语法及元素,实体及Dtd约束技术,下面就正式进入PHP的Xml编程 使用PHP技术对Xml文件进行操作 常用的有以下三种技术: 1.PHP dom 2.PHP结合XPath操 ...

  4. 栈溢出笔记1.3 准备Shellcode

    经过1.1和1.2节的讲述,我们已经知道了怎样更改EIP的值. 程序运行函数之后将跳转到我们设定的位置開始运行,因此,我们须要准备一个自己的程序,接手后面的工作.这是一个什么样的程序?是一个C语言编写 ...

  5. java面试第十八天

    软件开发流程: 1.可行性分析 2.需求分析->开发测试 3.概要设计->分隔模块,定义框架等 4.详细设计->类设计.接口设计 5.编码 6.测试 7.部署 8.维护 单元测试: ...

  6. iOS- 快速实现展示布局

    概述 比较有规律的页面, 快速实现展示布局, 提高开发效率. 详细 代码下载:http://www.demodashi.com/demo/10713.html 看到这个界面,是不是觉得不像那种比较有规 ...

  7. 微信小程序+PHP:动态显示项目倒计时(格式:4天7小时58分钟39秒)

    1.一般我们说的显示秒杀都是指的单条数据,循环我没做. 效果: 2.wxml代码: <p class="endtime_act">距报名截止还有: <block ...

  8. iphone 如何给cydia添加中文源和威锋源

    http://zhidao.baidu.com/question/270663590.html英文的也没关系, 步骤是这样的, 1. 打开Cydia, 下面有五个项目, 然后选倒数第二个manage, ...

  9. Android学习系列(16)--App列表之圆角ListView

    有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈.甚至,有时觉得设计之殇是审美疲劳.直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中 ...

  10. Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...