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(); } } }
某次執行的結果如下:
[並發任務B] 開始執行
[並發任務D] 開始執行
[並發任務E] 開始執行
[並發任務A] 開始執行完畢,通知障礙器
[並發任務E] 開始執行完畢,通知障礙器
[並發任務D] 開始執行完畢,通知障礙器
[並發任務C] 開始執行
[並發任務B] 開始執行完畢,通知障礙器
[並發任務C] 開始執行完畢,通知障礙器
......終於要執行最後的任務了......