1. 程式人生 > >【Java併發程式設計】之二十二:併發新特性—障礙器CyclicBarrier(含程式碼)

【Java併發程式設計】之二十二:併發新特性—障礙器CyclicBarrier(含程式碼)

CyclicBarrier(又叫障礙器)同樣是Java 5中加入的新特性,使用時需要匯入java.util.concurrent.CylicBarrier。它適用於這樣一種情況:你希望建立一組任務,它們併發地執行工作,另外的一個任務在這一組任務併發執行結束前一直阻塞等待,直到該組任務全部執行結束,這個任務才得以執行。這非常像CountDownLatch,只是CountDownLatch是隻觸發一次的事件,而CyclicBarrier可以多次重用。

    下面給出一個簡單的例項來說明其用法:

import java.util.concurrent.BrokenBarrierException; 
import java.util.concurrent.CyclicBarrier; 

public class CyclicBarrierTest { 
        public static void main(String[] args) { 
                //建立CyclicBarrier物件,
				//並設定執行完一組5個執行緒的併發任務後,再執行MainTask任務
                CyclicBarrier cb = new CyclicBarrier(5, new MainTask()); 
                new SubTask("A", cb).start(); 
                new SubTask("B", cb).start(); 
                new SubTask("C", cb).start(); 
                new SubTask("D", cb).start(); 
                new SubTask("E", cb).start();
        } 
} 

/** 
* 最後執行的任務
*/ 
class MainTask implements Runnable { 
        public void run() { 
                System.out.println("......終於要執行最後的任務了......"); 
        } 
} 

/** 
* 一組併發任務 
*/ 
class SubTask extends Thread { 
        private String name; 
        private CyclicBarrier cb; 

        SubTask(String name, CyclicBarrier cb) { 
                this.name = name; 
                this.cb = cb; 
        } 

        public void run() { 
                System.out.println("[併發任務" + name + "]  開始執行"); 
                for (int i = 0; i < 999999; i++) ;    //模擬耗時的任務 
                System.out.println("[併發任務" + name + "]  開始執行完畢,通知障礙器"); 
                try { 
                        //每執行完一項任務就通知障礙器 
                        cb.await(); 
                } catch (InterruptedException e) { 
                        e.printStackTrace(); 
                } catch (BrokenBarrierException e) { 
                        e.printStackTrace(); 
                } 
        } 
}
    某次執行的結果如下:

[併發任務A]  開始執行
[併發任務B]  開始執行
[併發任務D]  開始執行
[併發任務E]  開始執行
[併發任務A]  開始執行完畢,通知障礙器
[併發任務E]  開始執行完畢,通知障礙器
[併發任務D]  開始執行完畢,通知障礙器
[併發任務C]  開始執行
[併發任務B]  開始執行完畢,通知障礙器
[併發任務C]  開始執行完畢,通知障礙器
......終於要執行最後的任務了......

    從結果可以看出:MainTask任務在一組中的5個任務執行完後才開始執行。