Java中的CyclicBarrier

CyclicBarrier的字面意思就是可循环使用的屏障。它要做的事情就是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。

和CountDownLatch一样,CycliBarrier构造方法中接受一个int型的数值,代表屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。示例代码如下

public static void main(String[] args) {
    CyclicBarrier c = new CyclicBarrier(2);
    Thread t1 = new Thread(){
        @Override
        public void run() {
            System.out.println("我到了");
            try {
                c.await();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    };
    t1.start();
    System.out.println("我到了");
    try {
        c.await();
    }catch (Exception e){
        e.printStackTrace();
    }
    System.out.println("门开了");
}
如果我们把参数改为3,则主线程和子线程将会永远等待,因为没有第三个线程执行await方法,屏障永远不会开门。


除此之外,CyclicBarrier还提供了一个更高级的构造函数CyclicBarrier(int parties,Runnable barrier),用于在线程都到达屏障时,优先执行barrier。

public class Test1 {
    public static void main(String[] args) {
        CyclicBarrier c = new CyclicBarrier(2,new Run());

        Thread t1 = new Thread(){
            @Override
            public void run() {
                try {
                    System.out.println("我到了A");
                    c.await();
                    System.out.println("穿过屏障,我是第几个呢A");
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        };
        t1.start();
        System.out.println("我到了B");
        try {
            c.await();
            System.out.println("穿过屏障,我是第几个呢B");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
class Run implements Runnable{

    @Override
    public void run() {
        System.out.println("我是优先执行的那个");
    }
}

执行结果如下



可以看到穿过屏障,第一个执行的总是传入的Runnable,而不是A或B。

reset方法

    不像CountDownLatch类只能使用一次,CyclicBarrier可以循环使用,使用reset方法即可将屏障重置为其初始状态。

getNumberWaiting方法

    getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量

最后:

    CountDownLatch和CycliBarrier的区别

    1、CountDownLatch的计数器只能使用一次,而CyclicBarrer的计数器可以使用reset方法重置

    2、CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CyclicBarrierJava 的一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个屏障点,然后再一起继续执行。CyclicBarrier 可以循环使用,因此称之为循环屏障。 下面是 CyclicBarrier 工具类的基本使用示例: ```java import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo { public static void main(String[] args) { // 创建一个 CyclicBarrier 实例,指定等待线程数和屏障动作 CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> { System.out.println("所有线程已到达屏障点,开始执行屏障动作"); }); // 创建 3 个线程,模拟多个线程同时到达屏障点 for (int i = 0; i < 3; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + " 已到达屏障点,等待其他线程"); cyclicBarrier.await(); // 等待其他线程到达屏障点 System.out.println(Thread.currentThread().getName() + " 继续执行"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }).start(); } } } ``` 上述代码,我们创建了一个 CyclicBarrier 实例,指定等待线程数和屏障动作。然后创建了 3 个线程,模拟多个线程同时到达屏障点,每个线程到达屏障点后等待其他线程,直到所有线程到达屏障点,才会继续执行。 在 CyclicBarrier 的构造函数,我们指定了等待线程数为 3,也就是说,只有当 3 个线程都到达屏障点时,才会执行屏障动作。屏障动作是一个 Runnable 对象,它会在所有线程到达屏障点后执行一次。 在每个线程执行的代码,我们调用了 CyclicBarrier 的 await() 方法,等待其他线程到达屏障点。当所有线程都到达屏障点后,await() 方法会返回,线程继续执行。 需要注意的是,CyclicBarrier 的 await() 方法可能会抛出 InterruptedException 和 BrokenBarrierException 异常,因此需要在 catch 块处理这两个异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值