前言
jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jdk还有一个功能类似并发工具类CyclicBarrier,你知道它的作用吗?和CountDownLatch有什么区别呢?
对于CountDownLatch不了解的可以参考# CountDownLatch源码硬核解析
介绍和使用
CyclicBarrier,循环屏障,用来进行线程协作,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,会触发自己运行,运行完后,屏障又会开门,所有被屏障拦截的线程又可以继续运行。所以CyclicBarrier 是可以重用的。
为了更好的理解,我们举个例子,如下图所示:

我们将屏障想成栅栏,5个线程想成5头猪。5头猪开始往前跑,直到都跑到栅栏前,栅栏开始做个自己的任务,比如看看猪多重。然后打开栅栏,猪又会继续跑,跑到下一个栅栏,就这样循环....
API介绍
构造方法
public CyclicBarrier(int parties): 创建parties个线程任务的循环CyclicBarrierpublic CyclicBarrier(int parties, Runnable barrierAction): 当parties个线程到到屏障出,自己执行任务barrierAction
常用API
int await():线程调用await方法通知CyclicBarrier本线程已经到达屏障
基本使用
我们将上面猪猪的例子通过CyclicBarrier简单做一个实现。
@Slf4j(topic = "c.CyclicBarrierPig")
public class CyclicBarrierPig {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(5);
CyclicBarrier barrier = new CyclicBarrier(5, () -> {
System.out.println("主人看看哪个猪跑最快,最肥...");
});
// 循

本文介绍了CyclicBarrier的基本功能和使用,对比CountDownLatch的区别,并详细解析其实现原理。
最低0.47元/天 解锁文章
379





