CyclicBarrier 使用详解 电子说明书

佛说 2020-09-12 阅读:940 评论:0
1. CyclicBarrier 是什么?从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。它的作用就是会让所有线程都等待完成后才会继续下一步行动。举个例子,就像生活中我们会约朋友们到某个餐厅一起吃...

1. CyclicBarrier 是什么?

从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。

它的作用就是会让所有线程都等待完成后才会继续下一步行动。

举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。

2. 怎么使用 CyclicBarrier

2.1 构造方法

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

解析:

  • parties 是参与线程的个数

  • 第二个构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务

2.2 重要方法

public int await() throws InterruptedException, BrokenBarrierExceptionpublic int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException

解析:

  • 线程调用 await() 表示自己已经到达栅栏

  • BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时

2.3 基本使用

2.3.1 需求

一个线程组的线程需要等待所有线程完成任务后再继续执行下一次任务

2.3.2 代码实现

public class CyclicBarrierDemo {

    static class TaskThread extends Thread {
        
        CyclicBarrier barrier;
        
        public TaskThread(CyclicBarrier barrier) {
            this.barrier = barrier;
        }
        
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                System.out.println(getName() + " 到达栅栏 A");
                barrier.await();
                System.out.println(getName() + " 冲破栅栏 A");
                
                Thread.sleep(2000);
                System.out.println(getName() + " 到达栅栏 B");
                barrier.await();
                System.out.println(getName() + " 冲破栅栏 B");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {
        int threadNum = 5;
        CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
            
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " 完成最后任务");
            }
        });
        
        for(int i = 0; i < threadNum; i++) {
            new TaskThread(barrier).start();
        }
    }
    }

打印结果:

Thread-1 到达栅栏 A
Thread-3 到达栅栏 A
Thread-0 到达栅栏 A
Thread-4 到达栅栏 A
Thread-2 到达栅栏 A
Thread-2 完成最后任务
Thread-2 冲破栅栏 A
Thread-1 冲破栅栏 A
Thread-3 冲破栅栏 A
Thread-4 冲破栅栏 A
Thread-0 冲破栅栏 A
Thread-4 到达栅栏 B
Thread-0 到达栅栏 B
Thread-3 到达栅栏 B
Thread-2 到达栅栏 B
Thread-1 到达栅栏 B
Thread-1 完成最后任务
Thread-1 冲破栅栏 B
Thread-0 冲破栅栏 B
Thread-4 冲破栅栏 B
Thread-2 冲破栅栏 B
Thread-3 冲破栅栏 B

从打印结果可以看出,所有线程会等待全部线程到达栅栏之后才会继续执行,并且最后到达的线程会完成 Runnable 的任务。

3. CyclicBarrier 使用场景

可以用于多线程计算数据,最后合并计算结果的场景。

4. CyclicBarrier 与 CountDownLatch 区别

  • CountDownLatch 是一次性的,CyclicBarrier 是可循环利用的

  • CountDownLatch 参与的线程的职责是不一样的,有的在倒计时,有的在等待倒计时结束。CyclicBarrier 参与的线程职责是一样的。

参考文章:

相关话题: CyclicBarrier
版权声明

本文仅代表作者观点,不代表破站立场。
本文系作者授权破站发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • 武夷新区轻轨1号线通车啦!全程只要10元,沿途风景绝了!

    武夷新区轻轨1号线通车啦!全程只要10元,沿途风景绝了!
    这不,前两天我到武夷山,到的是南平市站(原武夷山东站),然后出站就进了武夷轻轨(官方称之为“武夷有轨电车”)站,工作人员有点少,没有防护栏(这玩意速度不快),看起来就像动车站似的。给大家看看我拍摄的图片:这是列车到站的时候,南平市站这是终点站,它到前面去掉头了,掉过头来,上车这边是没有防护栏的。大家是不是好奇这玩意怎么付钱?目前它还不支持现金,只能通过微信关注公众号后开通免密付款,然后大开武夷有轨小程序,出现乘车码,上车的时候扫一下,下车再扫一下就行了,在给大家看看它的内部长...
  • 武夷山武叶茶叶有限公司获得一次性泡茶棒专利证书

    武夷山武叶茶叶有限公司获得一次性泡茶棒专利证书
    专利摘要本实用新型提供了一次性泡茶棒,涉及纸容器技术领域。在现有技术中,一次性泡茶容器多为泡茶袋,其空间有限且容易变形,难以用于泡制完整的茶叶。本实用新型一次性泡茶棒,包含内置第一容腔的外棱台,和内置第二容腔的内棱台,所述外棱台用以支撑内棱台,所述内棱台可放置在第一容腔内,所述第二容腔内可放置茶叶,所述内棱台的侧壁上配置有过滤孔,所述过滤孔能够阻止茶叶自所述第二容腔内流到所述内棱台外。本实用新型主要用于泡制叶片完整的茶叶。《一次性泡茶棒》是武夷山武叶茶叶有限公司于2021.0...
  • 打完新冠疫苗真的可以喝酒吗?医生这样说

    打完新冠疫苗真的可以喝酒吗?医生这样说
    春节近了!年前的各种聚会兴起!同事聚会、同学聚会、公司放假前的聚会等等。聚会免不了吃吃喝喝!无酒不成席!白酒,红酒,啤酒都会上桌。新冠疫苗加强针都差不多这个时间,打疫苗也进入高峰期,最开始打新冠疫苗的时候,医院发过建议打过疫苗后,7天内不要饮酒。打第二针的时候就没有强调了,我在打第三针(加强针)的时候,医生就没有提醒了,很多人应该也遇到过跟我一样的经历,让人觉得打完新冠疫苗喝酒没事。注射疫苗可以喝酒吗?那么打完疫苗真的可以喝酒吗?一个医生朋友这样说的,打完新冠疫苗不可以喝酒,...
  • 真好看啊[/色],抖音河南贝儿罕见露出超长大白腿!

    真好看啊[/色],抖音河南贝儿罕见露出超长大白腿!
    现在做网红真的是很难了,做到好几百万粉丝的河南贝儿。这个贝儿,一直都是拍对嘴唱歌视频的,后来做了一段时间带货直播,不过现在大家都知道,直播带货是要投很多流量的,也许是背后的资本扛不住了,又或者是她直播间转化不高,所以后面也没做了。不过,现在她做娱乐直播靠打赏也是有客观的收录。只是,做娱乐直播,就要有一技之长,而她正是用她的美貌,获得礼物打赏。为了获得更多粉丝流量,她也是发了很多视频,不过,现在越来越难获得的流量,她的视频也是越来越露,来看看:[/色]老色批们,这个好不好看啊!...
  • 硬核推荐!六堡茶品种有几种,六堡茶测评

    硬核推荐!六堡茶品种有几种,六堡茶测评
    六堡茶按照茶叶的老嫩程度,可分为茶谷(茶芽)、中茶、老茶婆、二白茶等种类。其中茶谷是指细嫩短小的茶叶,无论是芽头、一芽一叶、一芽两叶,只要比较短小,都可以叫做茶谷。中茶指夏季生长速度较快的一芽三四叶。老茶婆则是当地六堡茶农于秋后采摘的当年长大的老叶或隔年老叶。 六堡茶品种分类 传承下来的古法六堡茶常见有以下几大分类:茶谷、中茶、二白茶、老茶婆四类。 1、茶谷 指茶芽...