CyclicBarrier使用詳解

  1. 轉自:http://xijunhu.iteye.com/blog/713433

  2. import java.util.Random;  
  3. import java.util.concurrent.CyclicBarrier;  
  4.   
  5. /** *//** 
  6.  * CyclicBarrier類似於CountDownLatch也是個計數器, 
  7.  * 不同的是CyclicBarrier數的是調用了CyclicBarrier.await()進入等待的線程數, 
  8.  * 當線程數達到了CyclicBarrier初始時規定的數目時,所有進入等待狀態的線程被喚醒並繼續。 
  9.  * CyclicBarrier就象它名字的意思一樣,可看成是個障礙, 
  10.  * 所有的線程必須到齊後才能一起通過這個障礙。 
  11.  * CyclicBarrier初始時還可帶一個Runnable的參數, 
  12.  * 此Runnable任務在CyclicBarrier的數目達到後,所有其它線程被喚醒前被執行。 
  13.  */  
  14. public class CyclicBarrierTest {  
  15.   
  16.     public static class ComponentThread implements Runnable {  
  17.         CyclicBarrier barrier;// 計數器  
  18.         int ID;    // 組件標識  
  19.         int[] array;    // 數據數組  
  20.   
  21.         // 構造方法  
  22.         public ComponentThread(CyclicBarrier barrier, int[] array, int ID) {  
  23.             this.barrier = barrier;  
  24.             this.ID = ID;  
  25.             this.array = array;  
  26.         }  
  27.   
  28.         public void run() {  
  29.             try {  
  30.                 array[ID] = new Random().nextInt(100);  
  31.                 System.out.println("Component " + ID + " generates: " + array[ID]);  
  32.                 // 在這裏等待Barrier處  
  33.                 System.out.println("Component " + ID + " sleep");  
  34.                 barrier.await();  
  35.                 System.out.println("Component " + ID + " awaked");  
  36.                 // 計算數據數組中的當前值和後續值  
  37.                 int result = array[ID] + array[ID + 1];  
  38.                 System.out.println("Component " + ID + " result: " + result);  
  39.             } catch (Exception ex) {  
  40.             }  
  41.         }  
  42.     }  
  43.     /** *//** 
  44.      * 測試CyclicBarrier的用法 
  45.      */  
  46.     public static void testCyclicBarrier() {  
  47.         final int[] array = new int[3];  
  48.         CyclicBarrier barrier = new CyclicBarrier(2new Runnable() {  
  49.             // 在所有線程都到達Barrier時執行  
  50.             public void run() {  
  51.                 System.out.println("testCyclicBarrier run");  
  52.                 array[2] = array[0] + array[1];  
  53.             }  
  54.         });  
  55.   
  56.         // 啓動線程  
  57.         new Thread(new ComponentThread(barrier, array, 0)).start();  
  58.         new Thread(new ComponentThread(barrier, array, 1)).start();  
  59.     }  
  60.   
  61.     public static void main(String[] args) {  
  62.         CyclicBarrierTest.testCyclicBarrier();  
  63.     }  

  1. }  
  2. 說明:在main中執行testCyclicBarrier方法 
    執行到CyclicBarrier barrier = new CyclicBarrier(2, new Runnable()...)時 
    Runnable的參數是在CyclicBarrier的數目達到2時並且所有被CyclicBarrier.await()進入等待的線程被喚醒前執行。 
    所以繼續執行下面的兩個線程 
    new Thread(new ComponentThread(barrier, array, 0)).start(); 
    new Thread(new ComponentThread(barrier, array, 1)).start(); 
    執行public void run()方法,分別執行,互不影響 
    執行到barrier.await();時該線程進入等待狀態,當兩個線程都執行完barrier.await();時,進入到new CyclicBarrier(2, new Runnable()...)裏面的方法, 執行完裏面的方法後,等待的兩個線程再次被喚醒,繼續各自執行線程後面的語句。

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