从有点基础开始学JUC:辅助类-CyclicBarrier

58 阅读2分钟

辅助类-CyclicBarrier

概述

顾名思义, “循环栅栏” ,是Java提供的一种特定场景下的多线程之间进行交互的使用方法

CyclicBarrier有几个比较重要的方法

方法描述
public CyclicBarrier(int parties)构造器方法,parties 是参与线程的个数,每个线程使用await()方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。
public CyclicBarrier(int parties, Runnable barrierAction)构造方法,有一个 Runnable 参数,这个参数的意思是,线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。
await()线程调用 await() 表示自己已经到达栅栏,此时该线程将被阻塞

例子

举个例子,现在有一批人约好一起在一家餐厅吃饭,人到齐了才能开饭,该如何实现呢?

这就要用到CyclicBarrier了,代码如下:

public class Meal {
​
    public static void main(String[] args) {
​
        CyclicBarrier cyclicBarrier = new CyclicBarrier(6, () -> {
            System.out.println("人数到齐,开始吃饭");
        });
​
        for (int i = 0; i < 6; ++i) {
            int finalI = i + 1;
            new Thread(() -> {
​
                try {
                    System.out.println("用户" + finalI + "到场,等待开饭");
                    cyclicBarrier.await();
                    System.out.println("用户" + finalI + "完成用餐");
                } catch (InterruptedException | BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }
            }).start();
        }
​
    }
​
}

可以看到,我们创建了一个cyclicBarrier对象,我们设置其parties为6,然后在线程到达屏障时,优先执行打印"人数到齐,开始吃饭"。

看一下运行的结果:

用户2到场,等待开饭
用户1到场,等待开饭
用户3到场,等待开饭
用户4到场,等待开饭
用户5到场,等待开饭
用户6到场,等待开饭
人数到齐,开始吃饭
用户6完成用餐
用户2完成用餐
用户3完成用餐
用户1完成用餐
用户4完成用餐
用户5完成用餐
​
进程已结束,退出代码0

是符合我们的期望的

这就是这篇文章的内容了,欢迎大家的讨论,如有错漏,也请指出,谢谢~