15.Java5的CyclicBarrier同步工具
1 import java.util.concurrent.CyclicBarrier; 2 import java.util.concurrent.ExecutorService; 3 import java.util.concurrent.Executors; 4 5 /** 6 * CyclicBarrier 7 * 表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面, 8 * 这就好比整个公司的人员利用周末时间集合郊游一样,先各自从家出发到公司集合后, 9 * 再同时出发到公园游玩,在指定地点集合后再同时开始就餐。 10 * @author LiTaiQing 11 * 12 */ 13 public class CyclicBarrierTest { 14 public static void main(String[] args) { 15 ExecutorService service = Executors.newCachedThreadPool(); 16 final CyclicBarrier cb = new CyclicBarrier(3); 17 for (int i = 0; i < 3; i++) { 18 Runnable runnable = new Runnable() { 19 public void run() { 20 try { 21 Thread.sleep((long) (Math.random() * 10000)); 22 System.out.println("线程" 23 + Thread.currentThread().getName() 24 + "即将到达集合地点1,当前已有" 25 + (cb.getNumberWaiting() + 1) 26 + "个已经到达," 27 + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" 28 : "正在等候")); 29 cb.await(); 30 31 Thread.sleep((long) (Math.random() * 10000)); 32 System.out.println("线程" 33 + Thread.currentThread().getName() 34 + "即将到达集合地点2,当前已有" 35 + (cb.getNumberWaiting() + 1) 36 + "个已经到达," 37 + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" 38 : "正在等候")); 39 cb.await(); 40 Thread.sleep((long) (Math.random() * 10000)); 41 System.out.println("线程" 42 + Thread.currentThread().getName() 43 + "即将到达集合地点3,当前已有" 44 + (cb.getNumberWaiting() + 1) 45 + "个已经到达," 46 + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" 47 : "正在等候")); 48 cb.await(); 49 } catch (Exception e) { 50 e.printStackTrace(); 51 } 52 } 53 }; 54 service.execute(runnable); 55 } 56 service.shutdown(); 57 } 58 }