| 策略 | 行為 | 適用場景 |
| AbortPolicy (默認) | 拋 RejectedExecutionException | 關鍵業務,快速失敗,上層熔斷降級 |
| CallerRunsPolicy | 調用者線程執行任務 | 緩衝突發流量,利用調用者線程背壓 |
| DiscardPolicy | 靜默丟棄 | 非關鍵監控/日志,可容忍丟失 |
| DiscardOldestPolicy | 丟棄隊列頭部最老任務,重試提交 | 優先處理新請求,如實時行情推送 |
自定義拒絕策略:記錄日志 + 降級
public class LogAndFallbackRejectedHandler implements RejectedExecutionHandler {
private static final Logger log = LoggerFactory.getLogger(LogAndFallbackRejectedHandler.class);
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
log.warn("線程池拒絕任務: {}, 當前隊列: {}, 活躍線程: {}",
r.getClass().getSimpleName(), executor.getQueue().size(), executor.getActiveCount());
// 降級邏輯:寫入磁盤隊列、發送告警、返回默認值等
fallback(r);
}
}
四、Fork/Join 框架:分治遞歸任務的並行利器
核心類
ForkJoinPool:專用線程池,實現工作竊取算法。
ForkJoinTask:任務基類,子類 RecursiveTask (有返回值)、RecursiveAction (無返回值)。
工作竊取原理
- 每個工作線程維護一個雙端隊列 (Deque)。
- 任務分解產生的子任務 push 到隊頭。
- 線程處理完自身任務,從其他線程隊尾竊取任務執行。
- 減少全局隊列爭用,實現負載均衡,充分利用多核。
使用範例:並行求和
static class SumTask extends RecursiveTask {
private final long[] arr;
private final int lo, hi;
private static final int THRESHOLD = 10_000;
SumTask(long[] arr, int lo, int hi) { this.arr = arr; 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 += arr[i];
return sum;
}
int mid = (lo + hi) >>> 1;
SumTask left = new SumTask(arr, lo, mid);
SumTask right = new SumTask(arr, mid, hi);
left.fork(); // 異步執行左半部分
long rightAns = right.compute(); // 當前線程執行右半部分
return rightAns + left.join(); // 合併結果
}
}
// 執行
ForkJoinPool pool = new ForkJoinPool();
long sum = pool.invoke(new SumTask(arr, 0, arr.length));
JDK 內置 Fork/Join 應用
Arrays.parallelSort():大數組並行排序,多核下比串行快 2-4 倍。
Stream.parallel():並行流底層即 ForkJoinPool.commonPool()。
CompletableFuture 異步編排亦複用公共池。
生產配置清單
- ✅ 所有線程池顯式命名(ThreadFactory),禁用 Executors 默認工廠。
- ✅ 隊列必須有界,防止內存飛升 OOM。
- ✅ 核心參數外部化配置(Nacos/Apollo),支持動態調整無需重啟。
- ✅ 關鍵業務線程池隔離,避免非關鍵任務佔用資源導致核心業務超時。
- ✅ 監控指標:
activeCount, queueSize, completedTaskCount, rejectCount 接入 Prometheus。
- 上一篇文章: 從 Visual Studio 轉戰 Eclipse 快速上手指南:漢化、編輯器配置、智能提示、快捷鍵與格式化模板
- 下一篇文章: Spring 整合 Apache CXF 開發 JAX-RS RESTful Web Service 完整實戰:Maven 依賴、配置、驗證與源碼
Copyright ©
程式碼之家 All Rights Reserved