CyclicBarrier 讓一組線程相互等待,直到所有線程到達屏障點,再繼續執行。關鍵特性:
reset() 重置Runnableawait() 返回到達索引,可區分線程角色BrokenBarrierException:其他線程中斷/超時導致柵欄損壞import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Test {
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(7, 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();
new SubTask("F", cb).start();
new SubTask("G", 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 | BrokenBarrierException e) { e.printStackTrace(); }
}
}
[子任務E]開始執行了!
[子任務E]開始執行完成了,並通知障礙器已經完成!
[子任務F]開始執行了!
[子任務G]開始執行了!
[子任務F]開始執行完成了,並通知障礙器已經完成!
[子任務G]開始執行完成了,並通知障礙器已經完成!
[子任務C]開始執行了!
[子任務B]開始執行了!
[子任務C]開始執行完成了,並通知障礙器已經完成!
[子任務D]開始執行了!
[子任務A]開始執行了!
[子任務D]開始執行完成了,並通知障礙器已經完成!
[子任務B]開始執行完成了,並通知障礙器已經完成!
[子任務A]開始執行完成了,並通知障礙器已經完成!
>>>>主任務執行了!<<<<
Process finished with exit code 0
所有7個子任務完成後,MainTask 執行一次。柵欄可重複用於下一輪協作。
| 特性 | CyclicBarrier | CountDownLatch |
|---|---|---|
| 可重用性 | 是 (reset()) | 否 (一次性) |
| 屏障動作 | 支持 | 不支持 |
| 等待返回值 | 到達索引 | 無 |
| 典型場景 | 多階段迭代計算、並行測試 | 啟動初始化等待、一次性聚合 |