概念
cyclicBarrier的字面意思时可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法
例子
收集七龙珠,只有七颗龙珠收齐了才能召唤神龙,没得到七颗之前,其他得到的龙珠只能先放好,等到七颗收起完成才能一起召唤
代码实现
- new CyclicBarrier();第一个参数(即7)表示等待的线程数,第二个参数(即
()->{System.out.println("****集齐龙珠,召唤神龙****");}
)是达到7个后执行的方法,即构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务 - 线程调用 await() 表示自己已经到达栅栏
- BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时
package com.bowen;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("****集齐龙珠,召唤神龙****");
});
for (int i = 1; i <= 7; i++) {
final int temp = i;
new Thread(()->{
System.out.println("集到第"+temp+"颗龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
//结果
//集到第6颗龙珠
//集到第2颗龙珠
//集到第3颗龙珠
//集到第5颗龙珠
//集到第7颗龙珠
//集到第1颗龙珠
//集到第4颗龙珠
//****集齐龙珠,召唤神龙****