写点什么

图解 CyclicBarrier 运动员接力赛

用户头像
叫练
关注
发布于: 2021 年 03 月 01 日
图解CyclicBarrier运动员接力赛

图解游戏规则


大家都知道运动员短跑接力赛,今天我们并不是讲接力赛,我们讲“接力协作赛”,需要我们重新定义下游戏规则:如下图所示


image.png


现在有运动员 A,B,先定义游戏规则:赛道目前是 300 米,每个运动员在跑完第一个 100 米时,需要等待其他运动员跑完第一个 100 米,比如运动员 A 先跑完 100 米,而此时运动员 B 只跑了 95 米,那运动员 A 必须要等待运动员 B 跑完剩余的 5 米,然后再一起接着跑第 2 个 100 米,第三个 100 米,规则也和第 1 个 100 米类同,最后我们可以得出一个结论,两个运动员跑完 300 米赛道,最长需要花多少时间。【本案例纯属虚构,为了讲清楚 CyclicBarrier】。下面我们用代码模拟执行。


案例说明



import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;
/** * @author :jiaolian * @date :Created in 2021-03-01 14:56 * @description:回环屏障测试--接力赛 * @modified By: * 公众号:叫练 */public class CyclicBarrierTest {
private static final int THREAD_COUNT = 2; private static CyclicBarrier cyclicBarrier = new CyclicBarrier(2,()->{ System.out.println(Thread.currentThread().getName()+"冲破屏障"); }); private static ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);
public static void main(String[] args) { Runnable myTask = new MyTask(); //初始化两个运动员 for (int i=0 ;i<THREAD_COUNT; i++) { executorService.submit(myTask); } }
private static class MyTask implements Runnable { @Override public void run() { try { System.out.println(Thread.currentThread().getName()+"第1个100米"); cyclicBarrier.await(); System.out.println(Thread.currentThread().getName()+"第2个100米"); cyclicBarrier.await(); System.out.println(Thread.currentThread().getName()+"第3个100米"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }}
复制代码

如上代码:线程池模拟执行两个运动员,每个运动员执行完每个 100 米必须等待另一个运动员,执行结果和我们设想一致,如下图所示。其中 pool-1-thread-1,pool-1-thread-2 分别表示运动员 A,运动员 B。CyclicBarrier 初始化参数中有一个 Runnable 是用来冲破屏障回调的函数。


image.png


比较 CountDownLatch


CyclicBarrier 中文释义“回环屏障”,每个线程调用 await,计数器会减 1,如果此时计数器不为 0,线程会阻塞,如果计数器为 0 说明需要冲破屏障,会唤醒之前被阻塞的线程,并会重置计数器。源码实现中用到了独占锁和条件队列控制线程的进队和出队,CountDownLatch 用到的是共享锁,虽然实现不一样,底层都是 AQS,相对于 CountDownLatch 来说,CyclicBarrier 是它的补充,功能更强大。


总结


今天我们介绍了 CyclicBarrier,整理出来希望能对你有帮助,写的比不全,同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路,我是叫练公众号,微信号【jiaolian123abc】边叫边练。


发布于: 2021 年 03 月 01 日阅读数: 9
用户头像

叫练

关注

我是叫练,边叫边练 2020.06.11 加入

Java高级工程师,熟悉多线程,JVM

评论

发布
暂无评论
图解CyclicBarrier运动员接力赛