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

JDK 7 Fork/Join 框架:面向細顆粒並行的多核程式設計

     編輯:Java 相關知識

多核時代的 Java 演進

  • Java 1.0:單核心下的多執行緒(回應性)
  • JDK 5:java.util.concurrent 粗顆粒並發(任務級)
  • JDK 7:Fork/Join 框架 — 細顆粒資料並行(演算法級)

核心思想:Divide & Conquer 遞迴分解任務,配合 Work-Stealing 排程器,自動平衡負載至所有 CPU 核心。

核心類別 (java.util.concurrent)

類別用途
ForkJoinPool專用執行緒池,實作 Work-Stealing
RecursiveAction無回傳值任務 (void)
RecursiveTask<V>有回傳值任務
CountedCompleter計數完成觸發,適合非嚴格分治

範例:平行陣列加總

import java.util.concurrent.*;

public class SumTask extends RecursiveTask<Long> {
    private static final int THRESHOLD = 10_000;
    private final long[] array;
    private final int lo, hi;

    public SumTask(long[] array, int lo, int hi) {
        this.array = array; this.lo = lo; this.hi = hi;
    }

    @Override
    protected Long compute() {
        if (hi - lo <= THRESHOLD) {
            long sum = 0;
            for (int i = lo; i < hi; i++) sum += array[i];
            return sum;
        }
        int mid = (lo + hi) >>> 1;
        SumTask left = new SumTask(array, lo, mid);
        SumTask right = new SumTask(array, mid, hi);
        left.fork();              // 非同步執行左半
        long rightResult = right.compute(); // 當前執行緒執行右半
        return rightResult + left.join();   // 等待左半結果
    }

    public static void main(String[] args) {
        long[] data = new long[1_000_000];
        for (int i = 0; i < data.length; i++) data[i] = i;
        ForkJoinPool pool = new ForkJoinPool();
        long result = pool.invoke(new SumTask(data, 0, data.length));
        System.out.println("Sum = " + result); // 499999500000
    }
}

關鍵特性

  • Work-Stealing:閒置執行緒竊取雙端佇列尾部任務,減少爭用。
  • 低同步開銷:任務拆分至閾值以下直接循環,避免過度遞迴。
  • 適用場景:計算密集型、資料可分割(排序、搜尋、矩陣運算、圖像處理、MapReduce 風格)。
  • 不適用:I/O 密集、強同步、任務間強依賴。

JDK 7 其他並行增強

  • Phaser:靈活的柵欄同步器,支援動態註冊/註銷參與者
  • TransferQueue:生產者可選擇等待消費者取走
  • ThreadLocalRandom:高效能執行緒區域亂數
  • ConcurrentLinkedDeque:雙端佇列

遷移建議

  1. 識別 CPU 密集型遞迴/迴圈熱點
  2. 重構為 RecursiveTask/Action
  3. 設定合理閾值(經驗值:10k~100k 元素)
  4. 使用 ForkJoinPool.commonPool() (JDK 8+) 避免手動管理池
  5. 配合 JMH 基準測試驗證加速比
Fork/Join 讓 Java 在多核硬體上真正發揮資料並行能力,是高效能計算庫 (如 Parallel Streams、CompletableFuture) 的基石。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved