继续并发专题~

这次介绍CyclicBarrier:看一眼API的注释:

  1. /**
  2. * A synchronization aid that allows a set of threads to all wait for
  3. * each other to reach a common barrier point. CyclicBarriers are
  4. * useful in programs involving a fixed sized party of threads that
  5. * must occasionally wait for each other. The barrier is called
  6. * <em>cyclic</em> because it can be re-used after the waiting threads
  7. * are released.

大概意思:一个让一组线程同时阻塞到一个位置的同步辅助类。在包含固定线程且线程间必须相互等待的场景中非常有用。cyclic的意思是CyclicBarrier当等待的线程全部释放之后,可以重复使用。(英语水平就这样了。。。。)

CyclicBarrier 类似一个闸门,指定数目的线程都必须到达这个闸门,闸门才会打开。

下面使用CyclicBarrier模拟一个门禁系统:

需求是这样的:到放学时间,所有的学生必须刷卡,然后人数齐了自动开门,统一回家。这个需求刚刚的,避免了把部分孩子丢在学校发生危险,特别是幼儿园或者小学生~~

  1. package com.zhy.concurrency.cyclic;
  2.  
  3. import java.util.concurrent.BrokenBarrierException;
  4. import java.util.concurrent.CyclicBarrier;
  5.  
  6. /**
  7. * 安全的门禁系统
  8. *
  9. * @author zhy
  10. *
  11. */
  12. public class CyclicBarrierTest
  13. {
  14.  
  15. /**
  16. * 学生总数
  17. */
  18. private final int STUDENT_COUNT = 10;
  19.  
  20. /**
  21. * 当人到齐,自动开门程序
  22. */
  23. final CyclicBarrier barrier = new CyclicBarrier(STUDENT_COUNT,
  24. new Runnable()
  25. {
  26. @Override
  27. public void run()
  28. {
  29. System.out.println("人到齐了,开门....");
  30. }
  31. });
  32.  
  33. public void goHome() throws InterruptedException, BrokenBarrierException
  34. {
  35. System.out.println(Thread.currentThread().getName() + "已刷卡,等待开门回家~");
  36. barrier.await();
  37. System.out.println(Thread.currentThread().getName() + "放学回家~");
  38. }
  39.  
  40. public static void main(String[] args) throws InterruptedException,
  41. BrokenBarrierException
  42. {
  43.  
  44. final CyclicBarrierTest instance = new CyclicBarrierTest();
  45.  
  46. /**
  47. * 每个线程代表一个学生
  48. */
  49. for (int i = 0; i < instance.STUDENT_COUNT; i++)
  50. {
  51. new Thread("学生" + i +" " )
  52. {
  53. public void run()
  54. {
  55.  
  56. try
  57. {
  58. instance.goHome();
  59. } catch (InterruptedException e)
  60. {
  61. e.printStackTrace();
  62. } catch (BrokenBarrierException e)
  63. {
  64. e.printStackTrace();
  65. }
  66.  
  67. };
  68.  
  69. }.start();
  70. }
  71.  
  72. }
  73. }

输出结果:

  1. 学生1 已刷卡,等待开门回家~
  2. 学生3 已刷卡,等待开门回家~
  3. 学生5 已刷卡,等待开门回家~
  4. 学生9 已刷卡,等待开门回家~
  5. 学生7 已刷卡,等待开门回家~
  6. 学生0 已刷卡,等待开门回家~
  7. 学生2 已刷卡,等待开门回家~
  8. 学生6 已刷卡,等待开门回家~
  9. 学生8 已刷卡,等待开门回家~
  10. 学生4 已刷卡,等待开门回家~
  11. 人到齐了,开门....
  12. 学生4 放学回家~
  13. 学生1 放学回家~
  14. 学生3 放学回家~
  15. 学生5 放学回家~
  16. 学生9 放学回家~
  17. 学生2 放学回家~
  18. 学生6 放学回家~
  19. 学生0 放学回家~
  20. 学生7 放学回家~
  21. 学生8 放学回家~

哈哈,如果哪个幼儿园用了这么一套系统,孩子应该不会丢学校了吧,,,,开玩笑了;;

CyclicBarrier把所有的线程都阻塞在一个阀门位置,然后等到等待的线程数到达预设的值,就打开这个阀门。记得是阻塞线程,不是阻塞操作,在同一个线程使劲掉await是没什么效果的。

上面的例子显示了CyclicBarrier的基本用法,但是cyclic的功能并没有显示出来,既然注释中讲了,我们有必要来个例子看看:

我们改造下我们的门禁,毕竟刷卡好不现实,现在需求是这样的:学生一个人走太危险,现在门卫放学在门口守着,让学生3个一组的走。

  1. package com.zhy.concurrency.cyclic;
  2.  
  3. import java.util.concurrent.BrokenBarrierException;
  4. import java.util.concurrent.CyclicBarrier;
  5.  
  6. /**
  7. * 改造后的门禁系统
  8. *
  9. * @author zhy
  10. *
  11. */
  12. public class CyclicBarrierTest2
  13. {
  14.  
  15. /**
  16. * 学生总数
  17. */
  18. private final int STUDENT_COUNT = 12;
  19.  
  20. /**
  21. * 每3个人一组出门
  22. */
  23. final CyclicBarrier barrier = new CyclicBarrier(3,
  24. new Runnable()
  25. {
  26. @Override
  27. public void run()
  28. {
  29. System.out.println("有3个学生到齐了,放行....");
  30. }
  31. });
  32.  
  33. public void goHome() throws InterruptedException, BrokenBarrierException
  34. {
  35. System.out.println(Thread.currentThread().getName() + "已刷卡,等待开门回家~");
  36. barrier.await();
  37. }
  38.  
  39. public static void main(String[] args) throws InterruptedException,
  40. BrokenBarrierException
  41. {
  42.  
  43. final CyclicBarrierTest2 instance = new CyclicBarrierTest2();
  44.  
  45. /**
  46. * 每个线程代表一个学生
  47. */
  48. for (int i = 0; i < instance.STUDENT_COUNT; i++)
  49. {
  50. new Thread("学生" + i +" " )
  51. {
  52. public void run()
  53. {
  54.  
  55. try
  56. {
  57. instance.goHome();
  58. } catch (InterruptedException e)
  59. {
  60. e.printStackTrace();
  61. } catch (BrokenBarrierException e)
  62. {
  63. e.printStackTrace();
  64. }
  65.  
  66. };
  67.  
  68. }.start();
  69. }
  70.  
  71. }
  72. }

输出结果:

  1. 学生0 已刷卡,等待开门回家~
  2. 学生1 已刷卡,等待开门回家~
  3. 学生2 已刷卡,等待开门回家~
  4. 3个学生到齐了,放行....
  5. 学生3 已刷卡,等待开门回家~
  6. 学生5 已刷卡,等待开门回家~
  7. 学生7 已刷卡,等待开门回家~
  8. 3个学生到齐了,放行....
  9. 学生4 已刷卡,等待开门回家~
  10. 学生9 已刷卡,等待开门回家~
  11. 学生6 已刷卡,等待开门回家~
  12. 3个学生到齐了,放行....
  13. 学生11 已刷卡,等待开门回家~
  14. 学生10 已刷卡,等待开门回家~
  15. 学生8 已刷卡,等待开门回家~
  16. 3个学生到齐了,放行....

这个例子充分的体现了CyclicBarrier的复用性,是吧,这样的系统或许更实在些,0成本~哈哈~。

好了,有兴趣的欢迎留言、

Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统的更多相关文章

  1. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  2. Java 并发专题 : Executor具体介绍 打造基于Executor的Webserver

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章非常少有人看啊~哈~ 今天准备具体介绍jav ...

  3. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等

    继续并发专题~ FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞. 由于:Fu ...

  4. Java并发编程--CyclicBarrier

    概述 CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点.与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyc ...

  5. Java 并发专题 : Semaphore 实现 互斥 与 连接池

    继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...

  6. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

  7. Java并发--CountDownLatch CyclicBarrier ReentrantLock

    CountDownLatch CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.CountDownLatch使用一个数字count初始化,使 ...

  8. Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章很少有人看啊~哈~ 今天准备详细介绍java ...

  9. Java并发专题

    ——参考于码农求职小助手公众号 1.并行和并发有什么区别? 1. 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生: 2. 并行是在不同实体上的多个事件,并发是在同一 ...

随机推荐

  1. C语言之基本算法35—数组上三角之积 主对角之积 副对角之积

    //数组算法 /* ============================================================= 题目:求四阶矩阵上三角之积.主对角之积,副对角之积: 如 ...

  2. cURL安装和使用笔记

    0.前言     cURL是一个利用URL语法在命令行下工作的文件传输工具.它支持文件上传和下载,所以是综合传输工具,但习惯称cURL为下载工具.cURL还包含了用于程序开发的libcurl.cURL ...

  3. cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件

    cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件解决方法: 选择项目属性->c/c++->常规,在附加包括项目中加上对应的文件夹 cocos test项目的库(所 ...

  4. 算法起步之Kruskal算法

    原文:算法起步之Kruskal算法 说完并查集我们接着再来看这个算法,趁热打铁嘛.什么是最小生成树呢,很形象的一个形容就是铺自来水管道,一个村庄有很多的农舍,其实这个村庄我们可以看成一个图,而农舍就是 ...

  5. jQuery EasyUI API 中文文档 - 布局(Layout)

    <html> <head> <script src="jquery-easyui/jquery.min.js"></script> ...

  6. 敏捷开发用户故事系列之十一:CSDN博客用户故事分析

    这是敏捷开发用户故事系列的第十一篇.(栏目目录) 经常有人问起有没有完整的用户故事案例.本人在网上找了一下,大约能找到两三篇,但多数只是为了描述用户故事的语法而已,都不涉及用户故事的颗粒度.大量故事的 ...

  7. SCU 3132(博弈)

    传送门:windy和水星 -- 水星游戏 1 题意:在一张由 n*m 的格子组成的棋盘上放着 k 个骑士每个骑士的位置为(xi,yi),表示第xi行,第yi列骑士如果当前位置为(x,y),一步可以走的 ...

  8. Ajaxterm-0.10-8.el5.noarch.rpm CentOS 5 (RHEL 5) Download

    Ajaxterm-0.10-8.el5.noarch.rpm CentOS 5 (RHEL 5) Download Install Howto Download the latest epel-rel ...

  9. spring MVC拦截器01

    spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. sp ...

  10. VMware Player安装centos

    用VMware Player安装centos 到物理硬盘 想要學Linux,但卻不知道如何弄成雙系統?那就使用用虛擬機器來安裝Linux.使用虛體機器來玩,好處除了好裝之外,也不怕把電腦搞壞,不論你怎 ...