共计 1907 个字符,预计需要花费 5 分钟才能阅读完成。
图解游戏规则
大家都晓得运动员长跑接力赛,明天咱们并不是讲接力赛,咱们讲“接力合作赛”,须要咱们从新定义下游戏规则:如下图所示
当初有运动员 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 是用来冲破屏障回调的函数。
比拟 CountDownLatch
CyclicBarrier中文释义 “回环屏障”,每个线程调用 await,计数器会减 1,如果此时计数器不为 0,线程会阻塞,如果计数器为 0 阐明须要冲破屏障,会唤醒之前被阻塞的线程,并会重置计数器。源码实现中用到了独占锁和条件队列控制线程的进队和出队,CountDownLatch 用到的是共享锁,尽管实现不一样,底层都是 AQS,绝对于 CountDownLatch 来说,CyclicBarrier 是它的补充,性能更弱小。
总结
明天咱们介绍了 CyclicBarrier,整理出来心愿能对你有帮忙,写的比不全,同时还有许多须要修改的中央,心愿亲们加以斧正和点评,喜爱的请点赞加关注哦。 点关注,不迷路,我是【叫练 】 公众号 ,微信号【jiaolian123abc】 边叫边练。