来自张孝祥老师笔记。java
CyclicBarrier 表示你们彼此等待,你们集合好后才开始出发,分散活动后又在i指定地点集合碰面,这就比如整个公司的人员利用周末时间集体郊游同样,先各自从家出发到公司集合后,再同时出发到公园游玩,在指定地点集合后再同时开始就餐……dom
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CyclicBarrierTest { public static void main(String [] args){ ExecutorService service=Executors.newCachedThreadPool(); final CyclicBarrier cb=new CyclicBarrier(3); //三个线程同时到达 for(int i=0;i<3;i++){ Runnable runnable=new Runnable(){ public void run(){ try { Thread.sleep((long)(Math.random()*10000)); System.out.println("线程"+Thread.currentThread().getName()+ "即将到达集合地点1,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+ (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候")); try { cb.await(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } Thread.sleep((long)(Math.random()*10000)); System.out.println("线程"+Thread.currentThread().getName()+ "即将到达集合地点2,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+ (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候")); try { cb.await(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } Thread.sleep((long)(Math.random()*10000)); System.out.println("线程"+Thread.currentThread().getName()+ "即将到达集合地点3,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+ (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候")); try { cb.await(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; service.execute(runnable); } service.shutdown(); } } 运行结果: 线程pool-1-thread-3即将到达集合地点1,当前已有1个已到达正在等候 线程pool-1-thread-2即将到达集合地点1,当前已有2个已到达正在等候 线程pool-1-thread-1即将到达集合地点1,当前已有3个已到达都到齐了,继续走啊 线程pool-1-thread-1即将到达集合地点2,当前已有1个已到达正在等候 线程pool-1-thread-2即将到达集合地点2,当前已有2个已到达正在等候 线程pool-1-thread-3即将到达集合地点2,当前已有3个已到达都到齐了,继续走啊 线程pool-1-thread-2即将到达集合地点3,当前已有1个已到达正在等候 线程pool-1-thread-1即将到达集合地点3,当前已有2个已到达正在等候 线程pool-1-thread-3即将到达集合地点3,当前已有3个已到达都到齐了,继续走啊