一,介绍


​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. [模式识别].(希腊)西奥多里蒂斯&lt;第四版&gt;笔记5之__特征选取

    1,引言 有关模式识别的一个主要问题是维数灾难.我们将在第7章看到维数非常easy变得非常大. 减少维数的必要性有几方面的原因.计算复杂度是一个方面.还有一个有关分类器的泛化性能. 因此,本章的主要任 ...

  2. Win10系统安装Office2016错误,提示需要更新客户端的解决方法

    下载Troubleshoot.zip 运行 OffScrubC2R.vbs ok

  3. Stage3d AGAL GPU处理照片 旧照片效果 sepia || pixelbender

    如果看不到下边的flash,请更新flash player到最新版本. 利用AGAL实现旧照片效果,大家可以对照一下之前一篇文章,关于图像处理(pixelbender).硬件处理肯定会更快,但这里无法 ...

  4. el表达式 多条件判断

      el表达式 多条件判断 CreationTime--2018年9月13日08点59分 Author:Marydon 1.情景展示 ACCESS_ID == 'APP1039' 且 CARDTYPE ...

  5. SettingsMyEclipse

      迁移时间--2017年5月20日10:39:42 Author:Marydon-----------------------------------MyEclipse单独设置项---------- ...

  6. html中文乱码问题的解决

    当我试着用html写代码的时候,发现直接保存的文件用浏览器打开时中文显示是乱码的,所以我找了一些解决方法,可是原因不太明白,所以我也就不解释了,能够自己找找原因,以下提供解决方法: 在写的html的第 ...

  7. webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)

    服务器端: 1.编写wsdl文件 <?xml version="1.0" encoding="UTF-8" standalone="no&quo ...

  8. 成为JavaGC专家(3)—如何监控Java垃圾回收机制(转载)

    原文:http://www.importnew.com/3146.html 为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并 ...

  9. windows下编辑的shell复制到linux无法执行

    是因为格式不对 可用vim编辑器转换格式 在vim中执行命令: set ff=unix 设置打开方式为unix

  10. JDBC 实例--JDBC通过工具类DBUtil连接到数据库,让我们不再恐惧操作数据库

    利用JDBC连接到数据库一般需要几个步骤: 1.装载驱动程序. 2.建立连接. 3.发送和执行SQL语句. 4.释放资源 首先建立一个数据库: 脚本如下: create database csdn; ...