辅助类-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
是符合我们的期望的
这就是这篇文章的内容了,欢迎大家的讨论,如有错漏,也请指出,谢谢~