【Java併發程式設計】之二十二:併發新特性—障礙器CyclicBarrier(含程式碼)
阿新 • • 發佈:2019-01-02
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個任務執行完後才開始執行。