CyclicBarrier (循环栅栏)

本文详细解读了Java中的CyclicBarrier类,介绍了其如何帮助线程同步并在达到特定线程数时执行自定义操作,以及在遇到异常时的中断行为。通过实例展示了CyclicBarrier在多线程中的应用和潜在问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CyclicBarrier (循环栅栏)

日常记录
文档解释:
    一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

    CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

    对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则用 InterruptedException)以反常的方式离开。

    内存一致性效果:线程中调用 await() 之前的操作 happen-before 那些是屏障操作的一部份的操作,后者依次 happen-before 紧跟在从另一个线程中对应 await() 成功返回的操作。

构造方法

  1. CyclicBarrier(int parties)
    创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。
  2. CyclicBarrier(int parties, Runnable barrierAction)
    创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。

方法:

  1. int await()
    在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
  2. int await(long timeout, TimeUnit unit)
    在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。
  3. int getNumberWaiting()
    返回当前在屏障处等待的参与者数目。
  4. int getParties()
    返回要求启动此 barrier 的参与者数目。
  5. boolean isBroken()
    查询此屏障是否处于损坏状态。
  6. void reset()
    将屏障重置为其初始状态。
import java.util.concurrent.CyclicBarrier;

/**
 *  循环栅栏:CyclicBarrier
 *  CyclicBarrier(int parties, Runnable barrierAction)
 *      解释:当一组线程中的线程数量,没有达到CyclicBarrier中parties的值时,barrierAction的程序不会被执行
 *      如果执行中程序异常,那么所有调用await()方法的线程,都会同时被中断,并且提示:InterruptedException
 *  方法:
 *      await():在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待
 *      getNumberWaiting():返回当前在屏障处等待的参与者数目
 *
 *  最优解释:
 *      当线程数等于循环栅栏值时,才会,执行await()方法,如果线程数,不等于循环栅栏值
 *        ,那么每个调用cyclicBarrier.await()方法的线程,将处于,堵塞的等待,执行状态
 *        ,等待调用cyclicBarrier.await()方法的线程数
 *        ,等于,循环栅栏值,那么才会执行await()方法,
 *        ,await()方法,执行之后,才会执行CyclicBarrier对象中Runnable接口中的程序
 *        ,如果执行中程序异常,那么所有调用await()方法的线程,都会同时被中断,并且提示:InterruptedException
 *
 */
public class CyclicBarrierUse {
    private static final Integer NUMBER=7;

    public static void main(String[] args) {
        //定义循环栅栏中(线程)参与者的数量,等于该值,执行await()方法之后,函数接口中程序,才会执行
        CyclicBarrier cyclicBarrier=new CyclicBarrier(NUMBER,()->{
            System.out.println("所有线程,执行完成");
        });


            for (int i = 1; i <=7 ; i++) {
                new Thread((
                )->{
                    try {
                        System.out.println("当前线程:"+Thread.currentThread().getName());
                        /*
                           当线程数等于循环栅栏值时,才会,执行await()方法,如果线程数,不等于循环栅栏值
                             ,那么每个调用cyclicBarrier.await()方法的线程,将处于,堵塞的等待,执行状态
                             ,等待调用cyclicBarrier.await()方法的线程数
                             ,等于,循环栅栏值,那么才会执行await()方法,
                             ,await()方法,执行之后,才会执行CyclicBarrier对象中Runnable接口中的程序
                             ,如果执行中程序异常,那么所有调用await()方法的线程,都会同时被中断,并且提示:InterruptedException

                         */
                        cyclicBarrier.await();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                },"线程:"+String.valueOf(i)).start();

            }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值