CyclicBarrier 使用详解 电子说明书

佛说 2020-09-12 阅读:965 评论: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、茶谷 指茶芽...
  • 一篇读懂!茶叶百科 | 安吉白茶介绍,安吉白茶的特点和功效产地

    一篇读懂!茶叶百科 | 安吉白茶介绍,安吉白茶的特点和功效产地
    安吉白茶——绿茶·不发酵·性寒 产自浙江省湖州市安吉县,名为白茶,实属烘青绿茶,安吉白茶是一种珍罕的变异茶种,因叶色玉白形如凤羽,又称为“玉凤茶”。 产地 永久保护区:天荒坪镇。 核心保护区:递铺街道古城社区、马家村、老庄村等。 重点保护区:递铺街道青龙村、三官村、鹤鹿溪村、康山村、长乐社区、赤芝村、万亩村、垅坝村、荷花塘村等。 工艺...
  • 太疯狂了!90年代易武普洱生茶欣赏,易武普洱茶报价表

    太疯狂了!90年代易武普洱生茶欣赏,易武普洱茶报价表
    终!...
  • 真没想到!水温高用茶多,冲泡时间宜长还是宜短,泡茶用水温度越高,茶汤品质越好

    真没想到!水温高用茶多,冲泡时间宜长还是宜短,泡茶用水温度越高,茶汤品质越好
    水温高用茶多,冲泡时间宜短。泡茶的水温常见为100℃,适合大多数茶品,此外投茶量与冲泡时间则尤为关键,决定着茶汤滋味的适口性,投茶量需要根据茶具容量大小而定,一般茶水比例为1:20~1:50左右,不宜过多,其次每泡的冲泡参考为5~30秒,用茶较多,更需要快速出汤,否则茶汤过浓,茶汤苦涩。 投茶量究竟该如何把握呢 下面跟着昵茶网一起来看看,几款茶叶的投茶量。 注意:...