Java多線程併發經常使用類實例之:CyclicBarrier

來自張孝祥老師筆記。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個已到達都到齊了,繼續走啊
相關文章
相關標籤/搜索