java线程同步barrier_java多线程--同步屏障CyclicBarrier的使用

CyclicBarrier的概念理解:

CyclicBarrier的字面上的意思是可循环的屏障,是java并发包java.util.concurrent里的一个同步工具类,在我下载的JDK1.6的中文文档里对他的解释是:

java线程同步barrier_java多线程--同步屏障CyclicBarrier的使用_第1张图片

大体意思就是:让一组线程到达一个屏障,一个集合点时,被阻塞,直到所有的线程都到了这个集合点时,屏障才会打开,然后线程才能继续往下执行.举个简单的例子就是:旅游团带着一帮人参观景点,规定在下一个景点A处集合,于是导游就在景点A等着大家,导游就是这个集合点或者说屏障,直到所有的游客集合完毕,导游才会带着大家继续参观下一个景点B.

CyclicBarrier的使用:

CyclicBarrier有两个构造函数:

CyclicBarrier(int parties); int类型的参数表示有几个线程来参与这个屏障拦截,(拿上面的例子,即有几个人跟团旅游);

CyclicBarrier(int parties,Runnable barrierAction);当所有线程到达一个屏障点时,优先执行barrierAction这个线程.

最重要的一个方法:

await();每个线程调用await(),表示我已经到达屏障点,然后当前线程被阻塞,(拿上面的例子讲就是游客A表示到达了景点A,然后他就在那儿等着大家到齐).

应用场景:

CyclicBarrier可以用于多线程计算数据,最后合并计算结果的场景,我没怎么用过这个类,所有只能简单模拟一个功能.

需求描述:

假设现在需要计算3个学生的平均成绩,

每个学生共有三门成绩.

步骤是:先计算出每个学生的平均成绩

再根据每个学生的平均成绩来计算三个同学的平均成绩

使用CyclicBarrier

package com.wang.thread1;

import java.util.Set;

import java.util.concurrent.BrokenBarrierException;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.CyclicBarrier;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* 假设现在需要计算3个学生的平均成绩,

*每个学生共有三门成绩

*步骤是:先计算出每个学生的平均成绩

*再根据每个学生的平均成绩来计算所有有同学的平均成绩

*使用CyclicBarrier

* @author Administrator

*

*/

public class CyclicBarrier1 implements Runnable{

//创建初始化3个线程的线程池

private ExecutorService threadPool=Executors.newFixedThreadPool(3);

//创建3个CyclicBarrier对象,执行完后执行当前类的run方法

private CyclicBarrier cb=new CyclicBarrier(3,this);

//保存每个学生的平均成绩

private ConcurrentHashMap map=new ConcurrentHashMap();

public void count(){

for(int i=0;i<3;i++){

threadPool.execute(new Runnable(){

@Override

public void run() {

//计算每个学生的平均成绩,代码略()假设为60~100的随机数

int score=(int)(Math.random()*40+60);

map.put(Thread.currentThread().getName(), score);

System.out.println(Thread.currentThread().getName()+"同学的平均成绩为"+score);

try {

//执行完运行await(),等待所有学生平均成绩都计算完毕

cb.await();

} catch (InterruptedException | BrokenBarrierException e) {

e.printStackTrace();

}

}

});

}

}

@Override

public void run() {

int result=0;

Set set = map.keySet();

for(String s:set){

result+=map.get(s);

}

System.out.println("三人平均成绩为:"+(result/3)+"分");

}

public static void main(String[] args) {

CyclicBarrier1 cb=new CyclicBarrier1();

cb.count();

}

}

打印结果如下:

java线程同步barrier_java多线程--同步屏障CyclicBarrier的使用_第2张图片

Java并发(十三):并发工具类——同步屏障CyclicBarrier

先做总结 1.CyclicBarrier 是什么? CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点) ...

Java多线程同步问题的探究

一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...

转:关于JAVA多线程同步

转:http://lanvis.blog.163.com/blog/static/26982162009798422547/ 因为需要,最近关注了一下JAVA多线程同步问题.JAVA多线程同步主要依赖 ...

java多线程同步

一篇好文:java多线程机制同步原则 概括起来说,Java 多线程同步机制主要包含如下几点:1:如果一个类包含一个或几个同步方法,那么由此类生成的每一个对象都配备一个队列用来容纳那些等待执行同步的线程 ...

Java多线程-同步:synchronized 和线程通信:生产者消费者模式

大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

Java多线程同步集合--并发库高级应用

一.阻塞队列1.在多线程领域,所谓阻塞,在某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒2.ArrayBlockingQueue(效率高)和LinkedBlockingQueue是两个 ...

Java多线程同步 synchronized 关键字的使用

代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A, ...

Java多线程---同步与锁

一,线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 二.同步和锁定 1.锁的原理 Java中每个对象都有一个内置锁. 当程序运行到非静态的synchronized同步方法上时,自动 ...

Java多线程同步的方法

一 synchronized关键字 1.synchronized实现原理: ---基于对象监视器(锁) java中所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...

随机推荐

《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数016,xld,xld轮廓

Halcon分类函数016,xld,xld轮廓 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“ ...

HTML5之CSS3 3D transform 剖析式学习之一

最近坐地铁发现“亚洲动物基金”在地铁上做了很多公益广告,比较吸引人的是一个月熊的广告.做的很可爱.回去就搜了一下,发现这个网站是HTML5做的,非常炫. 所以想学习一下,方法就是传统的学习办法,模仿. ...

dwz_bootstrap + thinkphp

http://www.thinkphp.cn/code/936.html  回去继续学习 SuperWebSocket

KEIL中的变量相关

例:sfr P0=0x80表示P0口地址为80H:(sfr是字节操作) sfr16 T2=0xCC表示T2口地址的低地址为TL2=0XCC,高地址为TH2=0XCD(sfr16是字操作) 头文件reg ...

浅谈C# 多态的魅力(虚方法,抽象,接口实现)

前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

Unity — — UGUI之背包物品拖放

最新背包代码: Unity3D — — UGUI之简易背包 Unity版本:2017.3 功能:用UGUI实现简单的背包物品拖放/交换功能 一.简介 在UGUI下,物品的拖放脚本实现主要依赖于Unit ...

Computer Vision Resources

Computer Vision Resources Softwares Topic Resources References Feature Extraction SIFT [1] [Demo pro ...

Node.js学习笔记(2) - Node.js安装及入门hello world

今天来简单的记录一下Node.js的安装配置以及简单的入门 一.Node.js的安装 1.windows下的安装 windows下的安装很简单,只需要去官网http://nodejs.org中,找到w ...

e658. 组合图形

Area shape = new Area(shape1); shape.add(new Area(shape2)); shape.subtract(new Area(shape3)); shape. ...

你可能感兴趣的:(java线程同步barrier)