首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 5 線程新特性:CyclicBarrier 循環柵欄協作機制

     編輯:Java 相關知識

循環柵欄核心概念

CyclicBarrier 讓一組線程相互等待,直到所有線程到達屏障點,再繼續執行。關鍵特性:

  • 可重複使用(循環):reset() 重置
  • 可選屏障動作:到達方數時執行 Runnable
  • await() 返回到達索引,可區分線程角色
  • 拋出 BrokenBarrierException:其他線程中斷/超時導致柵欄損壞

代碼示例:7子任務完成後執行主任務

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 vs CountDownLatch

特性CyclicBarrierCountDownLatch
可重用性是 (reset())否 (一次性)
屏障動作支持不支持
等待返回值到達索引無
典型場景多階段迭代計算、並行測試啟動初始化等待、一次性聚合

應用場景

  • 多線程分段計算,匯總結果(如 MapReduce 分片)
  • 並行測試:多線程並發請求,等待全部完成驗證
  • 遊戲加載:多資源並行加載,全部就緒進入場景

出處:https://lavasoft.blog.51cto.com/62575/222738

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved