CyclicBarrier的基本使用
CyclicBarrier,一个同步辅助类,在API中是这么介绍的:
它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
通俗点讲就是:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。
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 < 8; i++) {
final int temp = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t集齐了第" + temp + "龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}, String.valueOf(i)).start();
}
}
}
简单说明:
CyclicBarrier:在构造方法里有两个参数,第一个就是意思为同行者个数,第二个为同行者个数都执行完后才执行的线程。
同行者如果先执行完,会堵塞,等待同行者都执行完,会统一释放,然后执行第二个参数的线程。