同步工具之CyclicBarrier

CyclicBarrier是一个线程工具,Cyclic是循环的意思,Barrier是“路障”的意思,CyclicBarrier表示这个“路障”可以循环使用。可以实现的功能:表示大家彼此等待,大家集合好之后才开始出发,分散活动后又在指定的地点集合碰面。

CyclicBarrier所实现的功能可以用下图来表示:

通过代码看一下CyclicBarrier的执行效果:

  • 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个线程彼此等待,都到达时,才开始执行新的任务。

你可能感兴趣的:(java,Cyclicbarrier,同步工具)