首页 > 其他分享 >CyclicBarrier使用详解

CyclicBarrier使用详解

时间:2022-09-22 15:33:17浏览次数:58  
标签:栅栏 Thread 到达 详解 线程 使用 CyclicBarrier public

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, BrokenBarrierException
public 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 参与的线程职责是一样的。

 

标签:栅栏,Thread,到达,详解,线程,使用,CyclicBarrier,public
From: https://www.cnblogs.com/hexrui/p/16719493.html

相关文章

  • 房产中介管理软件第7课:T4模板的使用
    因为创建Model、Repository、Service、Controller有大量重复的工作。除了一些通用的方法会整合到BaseRepository和BaseService里,剩余的还需要自定义。这时候就需要T4模板......
  • spring切面的使用
    1、切面的定义首先要理解‘切’字,需要把对象想象成一个立方体,传统的面向对象变成思维,类定义完成之后(封装)。每次实例化一个对象,对类定义中的成员变量赋值,就相当于对这个立......
  • Windows中使用Docker安装Redis
    1、拉取Redis以管理员身份运行CMD,执行如下命令拉取Redisdockerpullredis2、在D盘新建目录D:\Net_Program\Net_Docker\Redis 在D盘新建D:\Net_Program\Net_Doc......
  • Java中使用Hutool的ExecutorBuilder实现自定义线程池
    场景Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904SpringBoot+Lombok+Bui......
  • java - @Async 具体使用
    1.开启  @Async异步能力添加注解 @EnableAsync,可以放在启动类上,也可以在任意配置类上,因为我是需要配置自定义线程池,因此放在配置类上importorg.springframework.c......
  • 使用 BigQuery ML 的自动化机器学习 (AutoML)。轻松启动机器学习并验证 ML 是否值得投
    使用BigQueryML的自动化机器学习(AutoML)。轻松启动机器学习并验证ML是否值得投资。机器学习在许多行业中变得越来越流行,从金融到营销再到医疗保健。但让我们面对......
  • 使用cpolar为Ubuntu的网站配置有特色的地址
    在现代人的工作和生活中,互联网是必不可少的重要组成部分,无论是放松娱乐还是工作学习,都离不开互联网,想要在信息庞杂的互联网世界立足,吸引广大访客前来围观,不仅需要优质的网......
  • Android uiautomator 使用入门官方教程(中英对照)
    InadditiontounittestingtheindividualcomponentsthatmakeupyourAndroidapplication(suchasactivities,services,andcontentproviders),itisal......
  • 什么是微框架?你应该考虑使用的最好的…
    什么是微框架?你应该考虑使用的最好的…编写代码应该是您尽可能少地工作以获得最佳结果,本文将为您提供一个步骤课程。微框架……我认为它被低估了,同时被错误地重视。因此,......
  • vi使用教程
    vi/vim简介:vi或者说vim,分为三种模式1.命令模式(Commandmode):进入vi时所在的模式2.底行命令模式(Lastlinemode):在命令模式下输入:(冒号)进入3.插入模式(Insertmode):在命令......