來自張孝祥老師筆記。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個已到達都到齊了,繼續走啊