文档章节

JUC包学习之CyclicBarrier

james_you
 james_you
发布于 2014/05/04 21:54
字数 515
阅读 110
收藏 0
package cyclicBarrier;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/** 
 * CyclicBarrier类似于CountDownLatch也是个计数器, 
 * 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 
 * 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 
 * CyclicBarrier就象它名字的意思一样,可看成是个障碍, 
 * 所有的线程必须到齐后才能一起通过这个障碍,也就是一起开始完成run方法的运行。 
 * 作用在每个卡在每个子线程上
 * CyclicBarrier初始时还可带一个Runnable的参数, 
 * 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。 
 */ 
public class CyclicBarrierTest {
    private CyclicBarrier barrier;
    //启动多个线程,多线程汇总二维数组每行的结果,然后汇总所有结果
    private int[][] data = new int[][]{
            {1,3,5,7,9},{2,4,6,8,10}
    };
    
    public CyclicBarrierTest() throws InterruptedException, BrokenBarrierException{
        //汇总数
        int total = 0;
        List<MyCaculate> threadList = new ArrayList<MyCaculate>();
        //启动二维数组行数个线程
        int threadCount = data.length;
        barrier = new CyclicBarrier(threadCount);
        for(int i=0;i<threadCount;i++){
            MyCaculate caculate = new MyCaculate(data[i],barrier);
            caculate.setName("caculate-thread-"+i);
            caculate.start();
            //System.out.println(caculate.isDone());
            threadList.add(caculate);
        }
        //
        for(MyCaculate c:threadList){
            while(true){
                if(c.isDone()){
                    total+=c.getSum();
                    break;
                }
            }
            //total+=c.getSum();
        }
        System.out.println("--------------------------------------");
        System.out.println("各行汇总结果操作完成,汇总结果:"+total);
        System.out.println("-------------------CyclicBarrier可以重复使用,再来一次--------------");
        total = 0;
        threadList.clear();
        for(int i=0;i<threadCount;i++){
            MyCaculate caculate = new MyCaculate(data[i],barrier);
            caculate.setName("caculate-thread-"+i);
            caculate.start();
            //System.out.println(caculate.isDone());
            threadList.add(caculate);
        }
        //
        for(MyCaculate c:threadList){
            while(true){
                if(c.isDone()){
                    total+=c.getSum();
                    break;
                }
            }
            //total+=c.getSum();
        }
        System.out.println("--------------------------------------");
        System.out.println("各行汇总结果操作完成,汇总结果:"+total);
    }
    

    public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
        CyclicBarrierTest c = new CyclicBarrierTest();
    }
}
class MyCaculate extends Thread
{
    private CyclicBarrier barrier;
    private int[] row;
    private int sum;
    private boolean isDone = false;
    
    public MyCaculate(int[] row,CyclicBarrier barrier){
        this.row = row;
        this.barrier = barrier;
    }
    
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" 开始计算");
        for(int i:row){
            sum+=i;
        }
        isDone = true;
        try {
            //阻塞计算完成标志,直到所有线程都计算完成
            barrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        
    }
    public int getSum(){
        return sum;
    }
    public boolean isDone(){
        return isDone;
    }
}

© 著作权归作者所有

james_you
粉丝 5
博文 25
码字总数 12119
作品 0
长宁
技术主管
私信 提问
JUC整体架构图

JUC相关整体框架图 整体架构.png JUC相关UML图 reentrantlock uml图 reentrantreadwritelock uml图 countdownlatch uml图 semaphore uml图 cyclicbarrier uml图...

小鱼嘻嘻
2018/01/18
0
0
JUC学习之CountDownLatch

package countDownLatch; import java.util.ArrayList;import java.util.List;import java.util.concurrent.CountDownLatch; /** * CountDownLatch类是一个同步计数器,构造时传入int参数,该参......

james_you
2014/05/04
231
0
111 多线程JUC包下代码分析

Java多线程系列目录(共43篇) AtomicLongFieldUpdater:通过反射+CAS实现对传入对象的指定long字段实现类似AtomicLong的操作 http://www.cnblogs.com/skywang12345/p/javathreadscategory.ht...

素雷
2017/10/31
34
0
Java 多线程系列目录(共43篇)

Java多线程系列目录(共43篇) 最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 ...

foxeye
2016/02/29
276
0
Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore

(原来写过一篇相同标题的文章,不过因为 OSChina 编辑器的缘故,格式改乱了,所以重写一篇。原文已删除,收藏原文的朋友对不住。) 这次说一下 JUC 中的同步器三个主要的成员:、 和 (不知...

编走编想
2014/03/13
5.2K
14

没有更多内容

加载失败,请刷新页面

加载更多

Experts say the weaker pound is drawing investors to the UK tech sector

UK tech companies secured a record £5.5bn in foreign investment in the first seven months of this year, research shows. This was more than the amount invested per capita in th......

wowloop
32分钟前
5
0
Add support for Android 9-patch images in BorderImage

The 9-patch image implementation in Qt Quick Controls 1 is an internal implementation detail of the Android style. It cannot handle .9.png image files out of the box, but takes ......

shzwork
37分钟前
5
0
c/c++日期时间处理函数小结

日期时间处理函数: 日期时间转为字符串 strftime/std::put_time 字符串解析成日期时间 strptime/std::get_time 时间结构转换:time_t->tm localtime:time_t->tm 时间结构转换:tm->time_t ...

chuqq
41分钟前
5
0
Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处...

大涛学长
42分钟前
4
0
创龙基于Xilinx Artix-7系列FPGA处理器

SOM-TLA7是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板,可配套广州创龙Artix-7开发板使用。核心板尺寸仅70mm*50mm,采用沉金无铅工艺的10层板设计,专业的PCB Layout保证信号...

Tronlong创龙
48分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部