栅栏CyclicBarrier
2014-04-25 22:50
309 查看
它允许一组线程互相等待,直到到达某个公共屏障点。利用栅栏,可以使线程相互等待,直到所有线程都到达某一点,然后栅栏将打开,所有线程将通过栅栏继续执行。CyclicBarrier支持一个可选的 Runnable 参数,当线程通过栅栏时,runnable对象将被调用。构造函数CyclicBarrier(int parties, Runnable barrierAction),当线程在CyclicBarrier对象上调用await()方法时,栅栏的计数器将增加1,当计数器为parties(设定的需要相互等待的线程数)时,栅栏将打开。
2013-10-09 10:38:03 甲 begin
going to the park!
2013-10-09 10:38:04 乙 begin
going to the park!
2013-10-09 10:38:05 丙 begin
going to the park!
2013-10-09 10:38:06 丁 begin
going to the park!
2013-10-09 10:38:09 乙 arrived
the park!
2013-10-09 10:38:09 丙 arrived
the park!
2013-10-09 10:38:12 甲 arrived
the park!
2013-10-09 10:38:14 丁 arrived
the park!
2013-10-09 10:38:14 all Arrived!
当4个人都到达公园时,都调用了一次await()方法,使栅栏的计数器变为4,等于visitorNum,所以栅栏将打开,执行内部 Runnable里的run方法。
publicclass BarrierVisitors { publicstaticvoid main(String[] args){ final String[] visitors =new String[] {"甲","乙","丙","丁" }; finalint visitorNum = visitors.length; final SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置栅栏,四个游客全部到达后一起进入公园 final CyclicBarrier arrived =new CyclicBarrier(visitorNum,new Runnable() { @Override publicvoid run() { Date arrivedDate =new Date(System.currentTimeMillis()); System.out.println(sdf.format(arrivedDate) +" all Arrived!"); } }); for(int i = 0; i < visitorNum; i++){ new Thread(new BarrierVisitor(visitors[i], sdf, arrived)).start(); try{ Thread.sleep(1000); }catch(InterruptedException e){ //TODO Auto-generated catch block e.printStackTrace(); } } } } class BarrierVisitorimplements Runnable{ final CyclicBarrier arrived; final String name; final SimpleDateFormatsdf; public BarrierVisitor(final String name, SimpleDateFormat sdf, final CyclicBarrier arrived){ this.name = name; this.arrived = arrived; this.sdf = sdf; } @Override publicvoid run(){ try{ //各自从家里出发,模拟从家出发到公园门口 Date startDate = new Date(System.currentTimeMillis()); System.out.println(sdf.format(startDate) +" " + this.name + " begin going to the park!"); Thread.sleep((long) (Math.random() * 10000)); }catch(Throwable e){ e.printStackTrace(); }finally{ //到达公园 Date arrivedDate = new Date(System.currentTimeMillis()); System.out.println(sdf.format(arrivedDate) +" " + this.name + " arrived the park!"); try{ arrived.await(); }catch(InterruptedException e){ e.printStackTrace(); }catch(BrokenBarrierException e){ e.printStackTrace(); } } } }输出结果:
2013-10-09 10:38:03 甲 begin
going to the park!
2013-10-09 10:38:04 乙 begin
going to the park!
2013-10-09 10:38:05 丙 begin
going to the park!
2013-10-09 10:38:06 丁 begin
going to the park!
2013-10-09 10:38:09 乙 arrived
the park!
2013-10-09 10:38:09 丙 arrived
the park!
2013-10-09 10:38:12 甲 arrived
the park!
2013-10-09 10:38:14 丁 arrived
the park!
2013-10-09 10:38:14 all Arrived!
当4个人都到达公园时,都调用了一次await()方法,使栅栏的计数器变为4,等于visitorNum,所以栅栏将打开,执行内部 Runnable里的run方法。
相关文章推荐
- java运行环境安装
- css定位
- 第7周作业2——编辑距离
- 【数据结构】 栈的基本操作
- [.NET 即时通信SignalR] 认识SignalR (一)
- override 报错处理
- 算法概论第七周作业
- 嵌入式文件系统:NTFS和EXFAT比较
- 嵌入式文件系统:NTFS和EXFAT比较
- 合并两个排序的链表(递归算法)
- 安卓Json数据的解析
- linux目录
- SUSE Linux 报错:too many open files in system
- Spring集成Restlet实践
- OpenCV 直方图计算函数 calcHist源码深度剖析
- C++迭代器失效讨论
- SVN服务器搭建和使用(四)
- 数据结构《16》----自动补齐实现《一》----Trie 树
- 位块传输 BitBlt与StretchBlt
- MVC4 js里给对象赋值