图解CyclicBarrier运动员接力赛

图解游戏规则


你们都知道运动员短跑接力赛,今天咱们并非讲接力赛,咱们讲“接力协做赛”,须要咱们从新定义下游戏规则:以下图所示java

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是用来冲破屏障回调的函数。ide

image.png


比较CountDownLatch


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



总结


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

相关文章
相关标签/搜索