CyclicBarrier 使用详解 电子说明书

佛说 2020-09-12 阅读:625 评论: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
版权声明

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

分享:

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

发表评论
热门文章
  • 2021年做什么网站赚钱比较快?给大家推荐8个类型!

    2021年做什么网站赚钱比较快?给大家推荐8个类型!
    随着网站越来越多,流量基本都被瓜分完了,想要做网站挣一点钱可真是不容易,如今想依靠做网站挣钱,就一定要选好网站类型,因为现在互联网上最不缺的就是网站了。一、淘宝客网站淘宝客网站比较简单,因为它建立好过后,只要设置好PID,所有的商品可以直接在淘宝上采集。甚至有的淘宝客网站,都不需要自己采集,个人站长要做的就是推广网站,让人家通过你的网站的链接去领券,然后去购买,你就有佣金赚了。二、黄色网站(不建议做)黄色网站包含黄色视频网站、图片网站、小说网站等,因为黄色网站很少,容易获得流...
  • 沃尔玛创始人山姆·沃尔顿的创业经历故事

    沃尔玛创始人山姆·沃尔顿的创业经历故事
    不论是在东方,还是在西方,很多人应该都知道沃尔玛。在我国,农村的朋友可能不太熟悉,但城里人几乎都知道沃尔玛。沃尔玛是一家全球连锁超市,其门店遍布全球各国各个城市。比如在我国,几乎每个地州市都会有沃尔玛的影子。 然而,沃尔玛刚创业的时候,也是经历了一番艰辛的,而今天我们就带大家读一读沃尔玛创始人山姆·沃尔顿的创业经历故事。 山姆·沃尔顿,1918年出生在美国俄克拉何马州的金菲舍镇,是一个土生土长的农村人。从小,山姆的家境就不是很富裕,父亲干过银行职员、农场贷...
  • 英文字母商标判定标准!原来一个字母和两个子母的商标最容易注册!

    英文字母商标判定标准!原来一个字母和两个子母的商标最容易注册!
    英文商标如何判断,规则在哪里?一、1个英文字母和2个英文字母1.英文字母申请商标中1个字母和两个字母不会按照字母来审查,是按照设计来的。2.如两个注册商标都是以“A”字母来注册,都注册成功。虽然都是A,但是设计不一样,是可以共存的。3.如两个字字母的,都是以“AB”字母注册的商标,两者的设计的形态是不一样的,同样是共存的商标。综上这些共存的商标例子,可以直观的让大家理解单独英文和两个英文的商标判断方法。二、3个英文字母1.三个字母相互不一样,不近似。2.三个字母组成一样,排列...
  • 武夷山旅游攻略之不花钱免费景点参观|武夷山本地人

    武夷山旅游攻略之不花钱免费景点参观|武夷山本地人
    听说我,你要是有驾驶证,到三姑那,扫一辆共享汽车,免费之旅启程吧!1、小武夷公园小武夷是免费的,从百花路那边上去就行了,山脚下有条很长的路,适合散步。要爬山的话,上去后往右边,登顶小武夷!2、列宁公园这个就是市公园,随便玩,就是一些花花树树,不推荐去这。3、武夷宫这里有彭祖、彭武、彭夷的雕像,除此之外,也没啥好看的。4、茶博园在三姑下面点,印象大红袍在那里演出,不过印象大红袍要买票,白天去不收费的。5、印象建州最近修的一个景点,像夜市一样,晚上宾馆住下后,建议去玩玩。很多武夷...
  • 【精】帝国时代2秘籍大全 使用方法及快捷键总结

    【精】帝国时代2秘籍大全 使用方法及快捷键总结
    在各种经典的单机游戏中,帝国时代2有着很高的人气,不同国家与民族间的斗争和丰富的自制地图模式吸引着大批游戏玩家,但是,由于游戏的初始资源都很低,多数玩家都不能一开始就获得很好的游戏体验感,因此,帝国时代2秘籍就显得很重要了,那么,帝国时代2秘籍是什么呢?帝国时代2秘籍包含了大量的英文指令,可以在游戏的任何阶段增加己方的资源、兵力,也可以加快己方的建筑速度、食物获取和木头获取速度,也可以随时消灭对方的兵力、农民等。如输入全英文ROCK ON即能为己方增加1000石头,输入LUM...