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

Java 線程池全景指南:四大預定義池、任務提交、生產者消費者模型實戰與避坑清單

     編輯:Java 綜合教學

為什麼需要線程池?

頻繁創建/銷毀線程開銷巨大 (內核對象分配、棧內存、上下文切換)。線程池實現 線程復用、任務隊列、生命周期管理,是高併發系統標配。

JDK 四大預定義線程池 (Executors 工廠)

工廠方法底層實現核心參數適用場景風險
newFixedThreadPool(n) ThreadPoolExecutor core=max=n, queue=LinkedBlockingQueue(無界) 固定併發數、長期運行任務 隊列無界 → OOM 風險
newCachedThreadPool() ThreadPoolExecutor core=0, max=Integer.MAX, queue=SynchronousQueue, keepAlive=60s 短時任務、數量波動大 無界線程 → 機器耗盡
newSingleThreadExecutor() FinalizableDelegatedExecutorService core=max=1, queue=LinkedBlockingQueue 串行執行、順序敏感任務 單點瓶頸、隊列無界
newScheduledThreadPool(n) ScheduledThreadPoolExecutor core=n, queue=DelayedWorkQueue 定時/周期任務 同 FixedThreadPool 風險

阿里巴巴開發手冊強制: 不允許使用 Executors 創建線程池,必須手動構建 ThreadPoolExecutor 明確有界隊列與拒絕策略。

手動構建生產級線程池


四大拒絕策略選型

策略行為適用場景
AbortPolicy (默認)拋 RejectedExecutionException關鍵業務,不可丟失,需上層捕獲降級
CallerRunsPolicy調用者線程執行任務 (背壓)緩衝突發流量,保護下游,犧牲調用者響應
DiscardPolicy靜默丟棄任務非關鍵監控、日志、指標上報
DiscardOldestPolicy丟棄隊列最舊任務,嘗試重新提交優先處理新請求,舊數據可丟

任務提交:Runnable vs Callable

 future = executor.submit(() -> {
    Thread.sleep(1000);
    return 42;
});
try {
    Integer result = future.get(2, TimeUnit.SECONDS); // 阻塞等待,支持超時
    System.out.println("Result: " + result);
} catch (TimeoutException e) {
    future.cancel(true); // 中斷任務
}

實戰:生產者-消費者模型 (車位管理系統)

領域模型

  • CarOwner (生產者): 駕車入庫
  • Secure (消費者): 記錄車輛離庫
  • CarPark (共享緩衝區): 固定容量車位列表

核心代碼

(100),
            r -> new Thread(r, "Owner-" + r.hashCode()),
            new ThreadPoolExecutor.CallerRunsPolicy()
        );

        // 3 個車主,分別駛入 3/3/1 輛
        pool.submit(new CarOwner(park, 3));
        pool.submit(new CarOwner(park, 3));
        pool.submit(new CarOwner(park, 1));

        // 3 個保安,分別駛出 1/2/1 輛
        pool.submit(new Secure(park, 1));
        pool.submit(new Secure(park, 2));
        pool.submit(new Secure(park, 1));

        pool.shutdown();
    }
}

JDK 7+ 阻塞隊列優化

生產環境建議直接使用 BlockingQueue 實現生產消費,無需手動 wait/notify:

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