一,有这样一个需求,旅游团,旅行出发前必须等待人都到齐了才出发,我们可以使用CyclicBarrier来实现二,CyclicBarrier提供了await()方法实现所有线程的阻塞,等所有线程都进来后才执行await()方法后的代码,代码如下:
public class CyclicBarrierTest {
public static void main(String[] args) {
//阻塞线程
CyclicBarrier cb = new CyclicBarrier(5);
ExecutorService service = Executors.newCachedThreadPool();
for (int i=1;i<=5;i++){
final int u = i;
Runnable r = new Runnable() {
@Override
public void run() {
try {
Thread.sleep((long) (Math.random()*1000));
System.out.println(u+"到达集合地点,"+"当前有"+(cb.getNumberWaiting()+1)+"个人在等待");
cb.await();//阻塞点
System.out.println("人到齐了可以出发去旅游了");
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(r);
}
service.shutdown();
}
}
三,执行完后控制台将输出
4到达集合地点,当前有1个人在等待
1到达集合地点,当前有2个人在等待
2到达集合地点,当前有3个人在等待
3到达集合地点,当前有4个人在等待
5到达集合地点,当前有5个人在等待
人到齐了可以出发去旅游了
人到齐了可以出发去旅游了
人到齐了可以出发去旅游了
人到齐了可以出发去旅游了
人到齐了可以出发去旅游了
|
|