您的位置:首页 > 其它

栅栏CyclicBarrier

2014-04-25 22:50 309 查看
它允许一组线程互相等待,直到到达某个公共屏障点。利用栅栏,可以使线程相互等待,直到所有线程都到达某一点,然后栅栏将打开,所有线程将通过栅栏继续执行。CyclicBarrier支持一个可选的 Runnable 参数,当线程通过栅栏时,runnable对象将被调用。构造函数CyclicBarrier(int parties, Runnable barrierAction),当线程在CyclicBarrier对象上调用await()方法时,栅栏的计数器将增加1,当计数器为parties(设定的需要相互等待的线程数)时,栅栏将打开。

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方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: