首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java并发编程之CyclicBarrier范例

2012-10-29 
Java并发编程之CyclicBarrier实例最近在看《Java并发编程实战》,对于想学习Java多线程编程的童鞋,我强烈推荐

Java并发编程之CyclicBarrier实例

最近在看《Java并发编程实战》,对于想学习Java多线程编程的童鞋,我强烈推荐这本书。


书上在讲到JDK5提供的并发包下的条件锁,CyclicBarrier的时候并没有给出具体的代码实例。问了下谷老师,也没发现什么特别好的文章,那只能自己来写一个了。


提到CyclicBarrier,那么必须先说一下Barrier,中文翻译为栅栏。什么是栅栏?其实这个中文翻译已经非常形象了,栅栏是对一组线程进行管理的锁。可以把栅栏想象成为一堵墙,这堵墙在建造的时候就设计好了,一定要有N个人才能把他推倒。这里说的人也就是我们的线程了,人数不够的时候,这些人都会被挡在墙前面。1个人推不倒,2个人推不倒。。。。N-1个人也推不倒,一旦第N个人来了,那么这个墙就应声倒下。接下来,N个人就可以继续往前走了,N个线程可以继续执行。


截止成文,在最新的JDK7中,Barrier语义的实现也只有一个CyclicBarrier类,那么接下来我就用CyclicBarrier来造一个实例。设计的场景是这样的:有一天,Eric坐在星巴克,突然想找人进行一场6人局的三国杀,就开始打电话给牌友 Shawn, Stone, Ashlee, Susie和Law,这5个朋友肯定不会住在一个房子里面啦,每个人到星巴克都需要耗费不同的时间,三国杀牌局必须等到所有人到达了才能开始。


把每个参与三国杀的人抽象为SanGuoShaer类,代码如下


? ? ? 构造函数执行的时候也就是这位童鞋接到发起人Eric电话的时候,这时TA知道了这件事,于是准备出门。

? 路上具体要花多少时间,这里产生一个1-10的随机数表示。

? run函数中,这位童鞋先出门,然后花了一定的时间在路上,然后到了星巴克

??barrier.await();

? 这位童鞋也点了饮料,坐下等着其他童鞋到,一旦其他同学到了,就是开始抓手牌。


? ?发起人Eric自然要辛苦点,要承担起通知其他同学,统计到的人数,准备到齐时候的牌堆等等。在统计人数的时候千万别忘记了,自己也要算上,所以CyclicBarrier是6个人不是5个人


? ??package SanGuoSha;



? ? 控制台的输出如下,也许你运行的结果跟我不一样,这是正常的~

??Eric 在星巴克: 要不组织个三国杀吧?

Shawn 接到电话!Stone 接到电话!Ashlee 接到电话!Shawn 准备出门了!Susie 接到电话!Ashlee 准备出门了!Susie 准备出门了!Stone 准备出门了!Law 接到电话!Eric 开始喝着咖啡,唱着歌,等人来杀~Law 准备出门了!Stone 已经到了Ashlee 已经到了Shawn 已经到了Law 已经到了Susie 已经到了三国杀开始啦,牌堆拿出来的干活~Susie开始抓手牌!Eric开始抓手牌Stone开始抓手牌!Ashlee开始抓手牌!Shawn开始抓手牌!Law开始抓手牌!

?

? ? 欢迎各位童鞋来交流~


?

热点排行