CyclicBarrier的使用
2016-07-25 01:55
453 查看
在java的线程同步器中有一个类叫做CyclicBarrier,使用这个类可以使多个线程在全部达到某种条件的情况下才能执行接下的任务。举个例子来说,田径比赛上,发令员必须等到所有的选手都准备好了之后才开枪,在任何一个运动员准备好之前,其他的运动员都是不可以抢跑的,必须等到所有的运动达到了准备状态才可以。
可以理解为调用了await()方法表示该线程已经准备好了,正在等待其他线程;当最后一个线程调用awit()方法时,所有的线程阻塞被解除。
package com.app.async; import java.util.concurrent.*; /** * Created by joe.wang on 2016/7/21. */ public class CyclicBarrierMotion { public static void main(String[] args) { CyclicBarrier barrier = new CyclicBarrier(3); ExecutorService service = Executors.newCachedThreadPool(); service.submit(new RunnningMan(barrier, "zhangsan")); service.submit(new RunnningMan(barrier, "lisi")); service.submit(new RunnningMan(barrier,"wangwu")); service.shutdown(); } } class RunnningMan implements Runnable { private CyclicBarrier mCyclicBarrier; private String tagName; public RunnningMan(CyclicBarrier barrier, String name) { this.mCyclicBarrier = barrier; tagName = name; } @Override public void run() { try { Thread.sleep(1000 * (int)(Math.random() * 10)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(tagName + " 准备好了!"); try { mCyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(tagName + "开始run!!"); } }
可以理解为调用了await()方法表示该线程已经准备好了,正在等待其他线程;当最后一个线程调用awit()方法时,所有的线程阻塞被解除。
相关文章推荐
- (HDU 1166) 敌兵布阵
- 利用Fiddler手机抓包对ONE·APP网页爬虫实现电影资讯微信Java开发
- QObject的event函数就可以改写对消息的处理
- GeekBand第十一周笔记
- SVN源码管理
- Caused by: java.lang.SecurityException: Permission Denif
- 如何做个好员工(转载)
- include、merge 、ViewStub
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)
- Android一行命令上传你的项目到Jcenter/Maven
- python魔法方法-属性访问控制
- 剑指offer面试题:求二叉树的镜像(递归、循环解法及测试用例)
- POJ 2253 Frogger dijkstra
- dip和px区别联系 产生的根源和设计时的影响如何?是否屏幕密度的决定原因?
- 平面最近点对问题求解
- NodeJs——(16)用Nodejs 4.X版本,制作一个微博网站(多图,详细步骤)(已完成)
- xml序列化到本地以及使用Pull解析xml
- HDU 1535 Invitation Cards(最短路 spfa)
- activeMQ启动报--找不到或无法加载主类
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)