文档章节

Java中CyclicBarrier的简单使用及原理

叫我哀木涕
 叫我哀木涕
发布于 2017/03/18 00:50
字数 406
阅读 127
收藏 0

1.类说明

    等待一组进程,共同达到一个障碍点或是将在给定数量的参与者(线程)处于等待状态时启动。

    CyclicBarrie支持一个可选的Runnable。在一组进程达到障碍点后执行。

    构造方法:

        CyclicBarrier(int parties)   
        CyclicBarrier(int parties, Runnable barrierAction)  

 

2.简单例子

package com.mt.demo;

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

public class MyCyclicBarrier {

    private final static int THREAD_NUM = 5;


    //线程
    static class Worker implements Runnable {

        CyclicBarrier cb = null;

        public Worker(CyclicBarrier cb) {
            this.cb = cb;
        }

        @Override
        public void run() {
            try {
                System.out.println("worker waiting");
                cb.await();
                System.out.println(Thread.currentThread().getId());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        //Runnable可选
        CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
            @Override
            public void run() {
                System.out.println("construct Runnbale");
            }
        });

        for (int i = 0; i < THREAD_NUM; i++) {
            new Thread(new Worker(cb)).start();
        }
    }
}

输出:

worker waiting
worker waiting
worker waiting
worker waiting
worker waiting
construct Runnbale
15
11
13
12
14

 

3.实现原理

    await等待所有的parties被调用。实际执行dowait

    /**
     * Waits until all {@linkplain #getParties parties} have invoked
     * {@code await} on this barrier.
     */
    public int await() throws InterruptedException, BrokenBarrierException {
        try {
            return dowait(false, 0L);
        } catch (TimeoutException toe) {
            throw new Error(toe); // cannot happen
        }
    }
 // loop until tripped, broken, interrupted, or timed out
            for (;;) {
                try {
                    if (!timed)
                        //重要,trip条件阻塞,此时lock锁释放
                        trip.await();
                    else if (nanos > 0L)
                        nanos = trip.awaitNanos(nanos);
                } catch (InterruptedException ie) {
                    if (g == generation && ! g.broken) {
                        breakBarrier();
                        throw ie;
                    } else {
                        // We're about to finish waiting even if we had not
                        // been interrupted, so this interrupt is deemed to
                        // "belong" to subsequent execution.
                        Thread.currentThread().interrupt();
                    }
                }

                if (g.broken)
                    throw new BrokenBarrierException();

                if (g != generation)
                    return index;

                if (timed && nanos <= 0L) {
                    breakBarrier();
                    throw new TimeoutException();
                }
            }

 

上面还有几行代码没贴,如果可以Lock,count--,判断count是否为0,不是0进入for循环。可以重新lock;是0说明可以执行断点,判断commend是否为null,不是执行Rannable。之后调用nextGeneration,进入下个周期。

 

© 著作权归作者所有

上一篇: wait¬ify
叫我哀木涕
粉丝 3
博文 32
码字总数 14012
作品 0
海淀
程序员
私信 提问
BAT最新Java面试题汇总:并发编程+JVM+Spring+分布式+缓存等!

前言 作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。 今天给大家分享下我整理的Java架构面试...

别打我会飞
2019/06/03
328
0
死磕 java同步系列之CyclicBarrier源码解析——有图有真相

问题 (1)CyclicBarrier是什么? (2)CyclicBarrier具有什么特性? (3)CyclicBarrier与CountDownLatch的对比? 简介 CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个...

彤哥读源码
2019/06/28
217
0
java多线程系列:通过对战游戏学习CyclicBarrier

CyclicBarrier是java.util.concurrent包下面的一个工具类,字面意思是可循环使用(Cyclic)的屏障(Barrier),通过它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一...

huangzd
2018/01/06
0
0
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
2018/05/06
0
0
线程池的创建以及CyclicBarrier与CountDownLatch的简单使用

一、线程池的简单创建 (1)、使用Executors进行创建 这两种线程池都是无界队列的线程池,创建比较简单,但可能导致堆积请求处理队列而消耗非常大的内存。 这种可缓存线程池,创建无脑暴力,...

Anur
2017/10/26
64
0

没有更多内容

加载失败,请刷新页面

加载更多

NASA的10条编码规则

关于NASA的10条编程规则,他们曾表示:这些规则的作用就像汽车上的安全带:最初,它们可能有点不舒服,但过了一会儿,它们的使用就变成了第二天性,而没有使用它们就变得不可想象。 Gerard J...

京东云技术新知
2分钟前
0
0
TortoiseSVN图标未显示在Windows 7下

我似乎无法在Windows 7下显示图标,我真的很想念Windows XP。 怎么修好? #1楼 他们在这里展示得很好 您使用的是64位版本的Windows 7以及32位版本的TortoiseSVN吗? 如果是这样,那么它们只会...

javail
26分钟前
11
0
开源播放器

DPlayer

glen_xu
33分钟前
134
0
gitlab Error:Gitaly - load linguist colors - permission denied

报错信息 2020-01-20_14:35:08.43180 time=“2020-01-20T14:35:08Z” level=info msg=“Starting Gitaly” version=“Gitaly, version 0.81.0, built 20180225.183225” 2020-01-20_14:35:0......

JennerLuo
39分钟前
125
0
微信小程序的自动化测试框架

微信发布了小程序的自动化测试框架Minium,提供了多种运行验证方式,其特点: 支持一套脚本,iOS & Android & 模拟器,三端运行 提供丰富的页面跳转方式,看不到也能去得到 可以获取和设置小...

测者陈磊
51分钟前
84
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部