【Java多線程】同步輔助類CyclicBarrier

   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();  
    }  
  
}



   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章