CyclicBarrier—循环屏障
上一篇 CountDownLatch 是计数器递减,归 0 后阻塞放开,这篇 CyclicBarrier 与之相同,也是计数器递减,归 0 后屏障放开。功能差不多,只是表现形式不一样。
CyclicBarrier:让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,屏障才会放开,所有被拦截的线程才能继续执行。
核心方法:CyclicBarrier # await()
举个栗子↓↓↓
public class CyclicBarrierDemo {
public static void main(String[] args) {
final CyclicBarrier barrier = new CyclicBarrier(7, new Runnable() {
@Override
public void run() {
System.out.println("七颗龙珠已集齐,召唤神龙!!!");
}
});
for (int i = 1; i <=7; i++) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("找到 "+ finalI +" 星龙珠");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
- - - - - - - - -
找到 1 星龙珠
找到 4 星龙珠
找到 3 星龙珠
找到 2 星龙珠
找到 7 星龙珠
找到 5 星龙珠
找到 6 星龙珠
七颗龙珠已集齐,召唤神龙!!!
在CyclicBarrier的构造方法里传入两个参数:第一个是最大计数—7,另一个是屏障放开时所要执行的Runnable。