CyclicBarrier是java.util.concurrent包下的一个同步辅助类,类似于CountDownLatch,也是一个同步计数器。


   与CountDownLatch不同的区别是:
    CountDownLatch的await()方法阻塞的原因是等待调用一定次数的countDown()方法, 可以在同一线程完成;

    CyclicBarrier的await()方法阻塞的原因是等待一定数量的线程调用await()方法, 必须在不同线程调用


   所以,概括来说:

    CountDownLatch是等待一定数量次调用countDown(),否则调用await()方法的线程会阻塞。

    CyclicBarrier 是等待一定数量线程调用await(),否则所有调用await()的线程会阻塞。


   演示代码:

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
  
public class TestCyclicBarrier {  
  
    public static void main(String[] args) {  
      
        ExecutorService exec = Executors.newCachedThreadPool();       
        
        /**
         * 表示必须每5个线程各执行了CyclicBarrier的await()方法, 才会执行CyclicBarrier里的run方法;
         * 如果不足5个线程执行await()方法, 那么执行await()方法的线程将会阻塞, 直到第5个线程执行了await()方法;
         */
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable(){  
            public void run() 
            {  
                System.out.println("大家都到齐了,开始happy去");  
            }
        }); 
        
        final Random random=new Random();
        for(int i = 0; i < 5; i++)
        {
            exec.execute(new Runnable(){  
                public void run() 
                {  
                    try 
                    {  
                        Thread.sleep(random.nextInt(1000));  
                    } 
                    catch (InterruptedException e) 
                    {  
                        e.printStackTrace();  
                    }  
                    System.out.println(Thread.currentThread().getName()+"到了,其他哥们呢");  
                    try 
                    {  
                    	//等待剩余的线程执行await()方法;
                        cyclicBarrier.await();
                    } 
                    catch(InterruptedException e) 
                    {  
                        e.printStackTrace();  
                    } 
                    catch(BrokenBarrierException e) 
                    {  
                        e.printStackTrace();  
                    } 
                    System.out.println(Thread.currentThread().getName()+"说: 人齐了, 打球去吧...");  
                }
            });  
        }  
        exec.shutdown();  
    }  
  
}