图解游戏规则


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

现在有运动员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】边叫边练。

最新文章

  1. 北京培训记day1
  2. 数据仓库之启用cdc
  3. .NET应用架构设计—表模块模式与事务脚本模式的代码编写
  4. windows下安装xgboost
  5. App.xaml.cs
  6. 9.Parameters
  7. Validform使用
  8. 乙醇脱氢酶力场文件的处理(含ZN,NAD,乙醇)
  9. Redis操作字符串工具类封装,Redis工具类封装
  10. PHP 性能追踪及分析工具(XHPROF)
  11. 控制结构(10) 指令序列(opcode)
  12. git reflog -- 显示所有提交
  13. tomcat证书配置
  14. SQA
  15. 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
  16. linux文件系统软链接硬链接
  17. pycharm在创建py文件时,自动添加文件头注释
  18. hdu 1254 推箱子(双重bfs)
  19. Redis中对Key进行分类
  20. caffe框架下目标检测——faster-rcnn实战篇问题集锦

热门文章

  1. Educational Codeforces Round 30
  2. CodeForces - 1250J The Parade 二分
  3. WPF 之路由事件和附加事件(六)
  4. KVM Pass-through 上部署 MiniSMB HurricaneII
  5. 由CloudStack项目引起的ESXI嵌套虚拟化引起的二级虚拟机无法被访问
  6. CS144学习(1)Lab 0: networking warmup
  7. 网络安全知识--PHP代码审计/Web For Pantesters 的 XSS
  8. springboot(五)Scheduling demo
  9. HDU 3966 Aragorn&#39;s Story(树链剖分)题解
  10. 买车交税 All In One