java.util.concurrent 粗顆粒並發(任務級)核心思想:Divide & Conquer 遞迴分解任務,配合 Work-Stealing 排程器,自動平衡負載至所有 CPU 核心。
| 類別 | 用途 |
|---|---|
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
}
}
Phaser:靈活的柵欄同步器,支援動態註冊/註銷參與者TransferQueue:生產者可選擇等待消費者取走ThreadLocalRandom:高效能執行緒區域亂數ConcurrentLinkedDeque:雙端佇列RecursiveTask/ActionForkJoinPool.commonPool() (JDK 8+) 避免手動管理池Fork/Join 讓 Java 在多核硬體上真正發揮資料並行能力,是高效能計算庫 (如 Parallel Streams、CompletableFuture) 的基石。