同步工具之CyclicBarrier

CyclicBarrier是一個線程工具,Cyclic是循環的意思,Barrier是「路障」的意思,CyclicBarrier表示這個「路障」能夠循環使用。能夠實現的功能:表示你們彼此等待,你們集合好以後纔開始出發,分散活動後又在指定的地點集合碰面。java

CyclicBarrier所實現的功能能夠用下圖來表示:dom

經過代碼看一下CyclicBarrier的執行效果:ide

  • 1-1 一個CyclicBarrier的例子
  •    
       
       
       
    1. import java.util.concurrent.CyclicBarrier; 
    2. import java.util.concurrent.ExecutorService; 
    3. import java.util.concurrent.Executors; 
    4.  
    5. public class CyclicBarrierTest { 
    6.  
    7.     public static void main(String[] args) { 
    8.         ExecutorService service = Executors.newCachedThreadPool(); 
    9.         final  CyclicBarrier cb = new CyclicBarrier(3);//3個線程 
    10.         for(int i=0;i<3;i++){//建立3個線程 
    11.             Runnable runnable = new Runnable(){ 
    12.                     public void run(){ 
    13.                     try { 
    14.                         Thread.sleep((long)(Math.random()*10000));//每一個線程「休息的」時間不一樣    
    15.                         System.out.println("線程" + Thread.currentThread().getName() +  
    16.                                 "即將到達集合地點1,當前已有" + (cb.getNumberWaiting()+1) +
    17.  "個已經到達," + (cb.getNumberWaiting()==2?"都到齊了,繼續前進":"正在等候"));                        
    18.                         cb.await();//先到的等待後到的,當3個都到達時纔會繼續向下執行 
    19.                          
    20.                         Thread.sleep((long)(Math.random()*10000));//每一個線程「休息的」時間不一樣        
    21.                         System.out.println("線程" + Thread.currentThread().getName() +  
    22.                                 "即將到達集合地點2,當前已有" + (cb.getNumberWaiting()+1) + 
    23. "個已經到達," + (cb.getNumberWaiting()==2?"都到齊了,繼續前進":"正在等候")); 
    24.                         cb.await();  
    25.                         Thread.sleep((long)(Math.random()*10000));//每一個線程「休息的」時間不一樣        
    26.                         System.out.println("線程" + Thread.currentThread().getName() +  
    27.                                 "即將到達集合地點3,當前已有" + (cb.getNumberWaiting() + 1) +
    28.  "個已經到達,"+ (cb.getNumberWaiting()==2?"都到齊了,繼續前進":"正在等候"));                      
    29.                         cb.await();                      
    30.                     } catch (Exception e) { 
    31.                         e.printStackTrace(); 
    32.                     }                
    33.                 } 
    34.             }; 
    35.             service.execute(runnable); 
    36.         } 
    37.         service.shutdown(); 
    38.     } 

程序執行的效果:工具

從上面的執行效果能夠看到,3個線程彼此等待,都到達時,纔開始執行新的任務。spa

相關文章
相關標籤/搜索