您的位置:首页 > 其它

同步工具CyclicBarrier

2017-12-19 00:52 302 查看

一.CyclicBarrier概述

从英文上面理解就是循环的障碍物

表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,在指定地点集合后再同时开始就餐



三个线程干完各自的任务,在不同的时刻到达集合点后,就尅接着忙各自的工作去了,再到达新的集合点,再去忙各自的工作,到达集合点了用CycicBarrier对象的await方法表示

为什么几个人能碰到一起,说白了,就是大家都把手头这一阶段的工作做完了,就可以碰到一起了,譬如,我下楼等方老师,就是等他手头工作做完了,他到达了要集合的状态,就集合了

public class CyclicBarrierTest {

public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(3);//3个人就满了

for(int i =0;i<3;i++) {
Runnable runnable = new Runnable() {

@Override
public void run() {
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点1, 当前已有"+
(cb.getNumberWaiting()+1)+"个已经到达,"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();

Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点2, 当前已有"+
(cb.getNumberWaiting()+1)+"个已经到达,"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();

Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点3, 当前已有"+
(cb.getNumberWaiting()+1)+"个已经到达,"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
};
service.execute(runnable);
}

service.shutdown();
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: