CyclicBarrier我的理解就是一个线程等待器,用途就是将注册了这个barrier的线程卡在同一个位置,直到注册这个barrier的所有线程都完成之后,继续执行。
下面是一个学习过程中采用的示例,计算每个学生分别的成绩,然后统一汇总计算全班成绩
package cyclic;

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo {
public static void main(String[] args) {
List<String> students = Arrays.asList("Tom","Bill","Dick","Marry","Lily","Harry");
StudentCalc calc = new StudentCalc();
CyclicBarrier cyclicBarrier = new CyclicBarrier(students.size(),new TotalScore(calc));//所有注册cyclicBarrier的线程完成后才会执行TotalScore线程
students.forEach(x-> new Thread(new StudentScore(cyclicBarrier,calc,x)).start());
System.out.println("我在主线程");//对后续无影响
}
} class TotalScore implements Runnable{
private StudentCalc studentCalc; TotalScore(StudentCalc studentCalc) {
this.studentCalc = studentCalc;
} @Override
public void run() {
studentCalc.total();//总成绩 计算
}
} class StudentScore implements Runnable{ private CyclicBarrier barrier;
private StudentCalc studentCalc;
private String studentName; public StudentScore(CyclicBarrier barrier, StudentCalc studentCalc, String studentName) {
this.barrier = barrier;
this.studentCalc = studentCalc;
this.studentName = studentName;
} @Override
public void run() {
studentCalc.student(studentName); try {
this.barrier.await();//计算完成后等待其他线程
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
} /**
* 计算类
*/
class StudentCalc {
/**
* 全部成绩计算完成后,调用汇总
*/
public void total(){
System.out.println("全体学生成绩汇总计算"); } /**
* 计算每个学生自己成绩,为了模拟每个学生计算时间不同,使用Thread.sleep区分
* @param student
*/
public void student(String student){
try {
Thread.sleep(new Random().nextInt(2000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("计算" + student + "成绩");
}
}

  示例很简单,具体CyclicBarrier是如何实现的,后面在慢慢研究。

输出结果不固定如下所示:

我在主线程
计算Lily成绩
计算Bill成绩
计算Tom成绩
计算Dick成绩
计算Marry成绩
计算Harry成绩
全体学生成绩汇总计算

学习了解CyclicBarrier的更多相关文章

  1. java高级---->Thread之CyclicBarrier的使用

    CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).今天我们就学习一下CyclicBarrier的用法. Cycl ...

  2. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

  3. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  4. Java并发包源码学习系列:同步组件CyclicBarrier源码解析

    目录 CyclicBarrier概述 案例学习 类图结构及重要字段 内部类Generation及相关方法 void reset() void breakBarrier() void nextGener ...

  5. JAVA多线程学习十三 - 同步工具CyclicBarrier与CountDownLatch

    一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...

  6. JUC源码学习笔记3——AQS等待队列和CyclicBarrier,BlockingQueue

    一丶Condition 1.概述 任何一个java对象都拥有一组定义在Object中的监视器方法--wait(),wait(long timeout),notify(),和notifyAll()方法, ...

  7. java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)

    多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...

  8. Java核心知识点学习----线程同步工具类,CyclicBarrier学习

    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...

  9. Java八个并发学习——线程同步工具CyclicBarrier

    本文是一篇文章对网络的研究摘要,感谢您的无私分享. CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量.当当中一个线程到达确定点,它会调用await() 方法来等待其它线 ...

随机推荐

  1. jsoup详解

    json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是"用来跨域的",一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩 ...

  2. 【翻译】从Store生成Checkbox Group

    原文:Ext JS: Generating a Checkbox Group from a Store Ext JS的checkbox group可以用来将复选框组合成一个单一的逻辑字段.由于复选框时 ...

  3. 结构体:探析C#文件方式读写结构体

    最近直在研究Net Micro Framework字体文件(tinyfnt)由于tinyfnt文件头部有段描述数据所以很想 定义个结构体像VC样直接从文件中读出来省得用流个个解析很是麻烦 没有想到在中 ...

  4. iOS基础常用细节问题处理65条

    1. 不可变数组  转变为可变数组  //声明实例变量的数组  必须记得实现 //对于遍历数组找到对象后 如果还需要查找 记得先结束 再查找(return/break) NSArray * arr = ...

  5. myeclipse 彻底让烦人的各种验证消失 让你的开发速度飞快

    大家都知道,myeclipse的验证很吭爹,不但保存的时候要难,BUILD的时候也要验.常常为了等它而浪费了大浪的时间!!真不知道设计人员当初是怎么加进这种功能的.真心不需要. 以前都是到window ...

  6. 2014新年福利,居然有人将Ext JS 4.1的文档翻译了

    原文:http://damoqiongqiu.iteye.com/blog/1998022

  7. OSB开发常用资料

    成功搭建OSB环境并运行HelloWorld项目 http://www.beansoft.biz/?p=2066 Oracle Service Bus 11gR1开发环境安装文档 http://www ...

  8. 【cocos 2d-x】VS2013+cocos2d-x3.3Final+Adriod交叉编译环境配置(超详细版)

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

  9. Cocoa公历和中国农历直接的转换

    看过某书上面的做法是先生成一个公历的calendar,使用的是: NSCalendar *cal = [NSCalendar currentCalendar]; 然后用它生成一个NSDateCompo ...

  10. DTN学习,theONE模拟器网络相关资料整理

    下面是一个百度空间的: http://hi.baidu.com/jensenliao 博客园的一篇博客:theONE模拟器简介(主要讲述,软件配置,软件结构) http://www.cnblogs.c ...