Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)相关的知识,希望对你有一定的参考价值。

一、CyclicBarrier的理解

  • CyclicBarrier属于java.util.concurrent包下;
  • CyclicBarrier字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行,叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用,我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

二、CyclicBarrier类中常用的方法

在这里插入图片描述

  • public int await() :用来挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务;
  • public int await(long timeout, TimeUnit unit):让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务。

三、CyclicBarrier类的使用示例一

使用场景,例如有10个人参加会议,等10个人都到齐后,才开始会议。注(示例中每个线程代表一个人。)

1、代码

package com.xz.thread.CyclicBarrier;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;

/**
 * @description:
 * @author: xz
 * @create: 2021-05-30 21:46
 */
public class Demo {
    Random random=new Random();
    //参加会议方法
    public void joinMeet(CyclicBarrier barrier){
        try {
            Thread.sleep(random.nextInt(4000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" 到达会议室,【等待开会】.......");
        try {
            //挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务。
            barrier.await();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //主方法,用于测试
    public static void main(String[] args) {
        Demo d =new Demo();

        //创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,
        //并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
        CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {
            @Override
            public void run() {
                System.out.println("10个人已到齐,开始开会。");
            }
        });

        //创建10个线程,每个线程代表一个人开会。
        for(int i=0;i<10;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    d.joinMeet(barrier);
                }
            }).start();
        }

    }
}

2、运行main函数,输出结果如下:

在这里插入图片描述
3、结论

  • 由第2步骤输出截图可知,当调用await()方法之后,挂起当前线程,当前线程就处于barrier了,直至所有线程都到达barrier状态再同时执行后续任务。

四、CyclicBarrier类的使用示例二

使用场景,例如有10个人参加会议,等10个人都到齐后,才开始会议。注(示例中每个线程代表一个人。其中一个线程抛出异常)

1、代码

package com.xz.thread.CyclicBarrier;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;

/**
 * @description:
 * @author: xz
 * @create: 2021-05-30 21:46
 */
public class Demo {
    Random random=new Random();
    //参加会议方法
    public void joinMeet(CyclicBarrier barrier){
        try {
            Thread.sleep(random.nextInt(4000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" 到达会议室,【等待开会】.......");

        //如果线程名称等于Thread-1,则抛出运行时异常
        if(Thread.currentThread().getName().equals("Thread-1")){
            throw new RuntimeException();
        }

        try {
            //挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务。
            barrier.await();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //主方法,用于测试
    public static void main(String[] args) {
        Demo d =new Demo();

        //创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,
        //并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
        CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {
            @Override
            public void run() {
                System.out.println("10个人已到齐,开始开会。");
            }
        });

        //创建10个线程,每个线程代表一个人开会。
        for(int i=0;i<10;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    d.joinMeet(barrier);
                }
            }).start();
        }

    }
}

2、运行main函数,输出结果如下:
在这里插入图片描述在这里插入图片描述

3、结论

  • 由第2步骤输出截图可知,如果某一线程抛出异常后,就不会在调用await()方法,所以后续的任务不会在执行,即没有输出 System.out.println(“10个人已到齐,开始开会。”);

以上是关于Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)的主要内容,如果未能解决你的问题,请参考以下文章

Java并发多线程编程——并发工具类CountDownLatch(线程计数器)

Java并发多线程编程——并发工具类CyclicBarrier(回环栅栏)

Java并发多线程编程——并发工具类Semaphore(信号量)

Java多线程系列:CountDownLatchSemaphore等4大并发工具类详解

Java多线程系列:CountDownLatchSemaphore等4大并发工具类详解

最全Java并发编程技能:多线程+线程池+线程锁+并发工具+并发容器