CyclicBarrier可循环使用的屏障,让一组线程到达一个屏障或同步点时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await方法。
代码示例
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("完成召唤");
});
for (int i = 0; i < 7; i++) {
final int finalI = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 收到第" + finalI + "龙珠");
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}, String.valueOf(i)).start();
}
}
执行结果
1 收到第1龙珠
4 收到第4龙珠
0 收到第0龙珠
5 收到第5龙珠
2 收到第2龙珠
3 收到第3龙珠
6 收到第6龙珠
完成召唤
CyclicBarrier和CountDownLatch的区别
CountDownLatch | CyclicBarrier |
---|---|
减计数方式 | 加计数方式 |
计算为0时释放所有等待的线程 | 计数达到指定值时释放所有等待线程 |
计数为0时,无法重置 | 计数达到指定值时,计数置为0重新开始 |
调用countDown()方法计数减1,调用await()方法只进行阻塞,对计数没任何影响 | 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞 |
不可重复利用 | 可重复利用 |