Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统
继续并发专题~
这次介绍CyclicBarrier:看一眼API的注释:
- /**
- * A synchronization aid that allows a set of threads to all wait for
- * each other to reach a common barrier point. CyclicBarriers are
- * useful in programs involving a fixed sized party of threads that
- * must occasionally wait for each other. The barrier is called
- * <em>cyclic</em> because it can be re-used after the waiting threads
- * are released.
大概意思:一个让一组线程同时阻塞到一个位置的同步辅助类。在包含固定线程且线程间必须相互等待的场景中非常有用。cyclic的意思是CyclicBarrier当等待的线程全部释放之后,可以重复使用。(英语水平就这样了。。。。)
CyclicBarrier 类似一个闸门,指定数目的线程都必须到达这个闸门,闸门才会打开。
下面使用CyclicBarrier模拟一个门禁系统:
需求是这样的:到放学时间,所有的学生必须刷卡,然后人数齐了自动开门,统一回家。这个需求刚刚的,避免了把部分孩子丢在学校发生危险,特别是幼儿园或者小学生~~
- package com.zhy.concurrency.cyclic;
- import java.util.concurrent.BrokenBarrierException;
- import java.util.concurrent.CyclicBarrier;
- /**
- * 安全的门禁系统
- *
- * @author zhy
- *
- */
- public class CyclicBarrierTest
- {
- /**
- * 学生总数
- */
- private final int STUDENT_COUNT = 10;
- /**
- * 当人到齐,自动开门程序
- */
- final CyclicBarrier barrier = new CyclicBarrier(STUDENT_COUNT,
- new Runnable()
- {
- @Override
- public void run()
- {
- System.out.println("人到齐了,开门....");
- }
- });
- public void goHome() throws InterruptedException, BrokenBarrierException
- {
- System.out.println(Thread.currentThread().getName() + "已刷卡,等待开门回家~");
- barrier.await();
- System.out.println(Thread.currentThread().getName() + "放学回家~");
- }
- public static void main(String[] args) throws InterruptedException,
- BrokenBarrierException
- {
- final CyclicBarrierTest instance = new CyclicBarrierTest();
- /**
- * 每个线程代表一个学生
- */
- for (int i = 0; i < instance.STUDENT_COUNT; i++)
- {
- new Thread("学生" + i +" " )
- {
- public void run()
- {
- try
- {
- instance.goHome();
- } catch (InterruptedException e)
- {
- e.printStackTrace();
- } catch (BrokenBarrierException e)
- {
- e.printStackTrace();
- }
- };
- }.start();
- }
- }
- }
输出结果:
- 学生1 已刷卡,等待开门回家~
- 学生3 已刷卡,等待开门回家~
- 学生5 已刷卡,等待开门回家~
- 学生9 已刷卡,等待开门回家~
- 学生7 已刷卡,等待开门回家~
- 学生0 已刷卡,等待开门回家~
- 学生2 已刷卡,等待开门回家~
- 学生6 已刷卡,等待开门回家~
- 学生8 已刷卡,等待开门回家~
- 学生4 已刷卡,等待开门回家~
- 人到齐了,开门....
- 学生4 放学回家~
- 学生1 放学回家~
- 学生3 放学回家~
- 学生5 放学回家~
- 学生9 放学回家~
- 学生2 放学回家~
- 学生6 放学回家~
- 学生0 放学回家~
- 学生7 放学回家~
- 学生8 放学回家~
哈哈,如果哪个幼儿园用了这么一套系统,孩子应该不会丢学校了吧,,,,开玩笑了;;
CyclicBarrier把所有的线程都阻塞在一个阀门位置,然后等到等待的线程数到达预设的值,就打开这个阀门。记得是阻塞线程,不是阻塞操作,在同一个线程使劲掉await是没什么效果的。
上面的例子显示了CyclicBarrier的基本用法,但是cyclic的功能并没有显示出来,既然注释中讲了,我们有必要来个例子看看:
我们改造下我们的门禁,毕竟刷卡好不现实,现在需求是这样的:学生一个人走太危险,现在门卫放学在门口守着,让学生3个一组的走。
- package com.zhy.concurrency.cyclic;
- import java.util.concurrent.BrokenBarrierException;
- import java.util.concurrent.CyclicBarrier;
- /**
- * 改造后的门禁系统
- *
- * @author zhy
- *
- */
- public class CyclicBarrierTest2
- {
- /**
- * 学生总数
- */
- private final int STUDENT_COUNT = 12;
- /**
- * 每3个人一组出门
- */
- final CyclicBarrier barrier = new CyclicBarrier(3,
- new Runnable()
- {
- @Override
- public void run()
- {
- System.out.println("有3个学生到齐了,放行....");
- }
- });
- public void goHome() throws InterruptedException, BrokenBarrierException
- {
- System.out.println(Thread.currentThread().getName() + "已刷卡,等待开门回家~");
- barrier.await();
- }
- public static void main(String[] args) throws InterruptedException,
- BrokenBarrierException
- {
- final CyclicBarrierTest2 instance = new CyclicBarrierTest2();
- /**
- * 每个线程代表一个学生
- */
- for (int i = 0; i < instance.STUDENT_COUNT; i++)
- {
- new Thread("学生" + i +" " )
- {
- public void run()
- {
- try
- {
- instance.goHome();
- } catch (InterruptedException e)
- {
- e.printStackTrace();
- } catch (BrokenBarrierException e)
- {
- e.printStackTrace();
- }
- };
- }.start();
- }
- }
- }
输出结果:
- 学生0 已刷卡,等待开门回家~
- 学生1 已刷卡,等待开门回家~
- 学生2 已刷卡,等待开门回家~
- 有3个学生到齐了,放行....
- 学生3 已刷卡,等待开门回家~
- 学生5 已刷卡,等待开门回家~
- 学生7 已刷卡,等待开门回家~
- 有3个学生到齐了,放行....
- 学生4 已刷卡,等待开门回家~
- 学生9 已刷卡,等待开门回家~
- 学生6 已刷卡,等待开门回家~
- 有3个学生到齐了,放行....
- 学生11 已刷卡,等待开门回家~
- 学生10 已刷卡,等待开门回家~
- 学生8 已刷卡,等待开门回家~
- 有3个学生到齐了,放行....
这个例子充分的体现了CyclicBarrier的复用性,是吧,这样的系统或许更实在些,0成本~哈哈~。
好了,有兴趣的欢迎留言、
Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统的更多相关文章
- java并发初探CyclicBarrier
java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...
- Java 并发专题 : Executor具体介绍 打造基于Executor的Webserver
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章非常少有人看啊~哈~ 今天准备具体介绍jav ...
- Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
继续并发专题~ FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞. 由于:Fu ...
- Java并发编程--CyclicBarrier
概述 CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点.与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyc ...
- Java 并发专题 : Semaphore 实现 互斥 与 连接池
继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...
- Java并发--CountDownLatch CyclicBarrier ReentrantLock
CountDownLatch CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.CountDownLatch使用一个数字count初始化,使 ...
- Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章很少有人看啊~哈~ 今天准备详细介绍java ...
- Java并发专题
——参考于码农求职小助手公众号 1.并行和并发有什么区别? 1. 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生: 2. 并行是在不同实体上的多个事件,并发是在同一 ...
随机推荐
- C语言之基本算法35—数组上三角之积 主对角之积 副对角之积
//数组算法 /* ============================================================= 题目:求四阶矩阵上三角之积.主对角之积,副对角之积: 如 ...
- cURL安装和使用笔记
0.前言 cURL是一个利用URL语法在命令行下工作的文件传输工具.它支持文件上传和下载,所以是综合传输工具,但习惯称cURL为下载工具.cURL还包含了用于程序开发的libcurl.cURL ...
- cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件
cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件解决方法: 选择项目属性->c/c++->常规,在附加包括项目中加上对应的文件夹 cocos test项目的库(所 ...
- 算法起步之Kruskal算法
原文:算法起步之Kruskal算法 说完并查集我们接着再来看这个算法,趁热打铁嘛.什么是最小生成树呢,很形象的一个形容就是铺自来水管道,一个村庄有很多的农舍,其实这个村庄我们可以看成一个图,而农舍就是 ...
- jQuery EasyUI API 中文文档 - 布局(Layout)
<html> <head> <script src="jquery-easyui/jquery.min.js"></script> ...
- 敏捷开发用户故事系列之十一:CSDN博客用户故事分析
这是敏捷开发用户故事系列的第十一篇.(栏目目录) 经常有人问起有没有完整的用户故事案例.本人在网上找了一下,大约能找到两三篇,但多数只是为了描述用户故事的语法而已,都不涉及用户故事的颗粒度.大量故事的 ...
- SCU 3132(博弈)
传送门:windy和水星 -- 水星游戏 1 题意:在一张由 n*m 的格子组成的棋盘上放着 k 个骑士每个骑士的位置为(xi,yi),表示第xi行,第yi列骑士如果当前位置为(x,y),一步可以走的 ...
- 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 ...
- spring MVC拦截器01
spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. sp ...
- VMware Player安装centos
用VMware Player安装centos 到物理硬盘 想要學Linux,但卻不知道如何弄成雙系統?那就使用用虛擬機器來安裝Linux.使用虛體機器來玩,好處除了好裝之外,也不怕把電腦搞壞,不論你怎 ...