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

Java 並發編程核心:線程池原理、配置參數與最佳實踐全解析

     編輯:Java 程式設計入門

為什麼需要線程池?

頻繁創建/銷毀線程開銷大,且無限制創建會耗盡系統資源導致 OOM。線程池三大核心優勢:

  1. 降低資源消耗:重用線程,減少創建銷毀開銷
  2. 提高響應速度:任務到達即執行,無需等待線程創建
  3. 提升可管理性:統一分配、調優、監控,防止資源耗盡

ThreadPoolExecutor 七大核心參數

new ThreadPoolExecutor(
    corePoolSize,      // 核心線程數
    maximumPoolSize,   // 最大線程數
    keepAliveTime,     // 非核心線程空閒存活時間
    unit,              // 時間單位
    workQueue,         // 任務隊列
    threadFactory,     // 線程工廠
    handler            // 拒絕策略
);

參數詳解

  • corePoolSize:提交任務時,若運行線程 < corePoolSize,直接創建新線程(即使有空閒核心線程)。調用 prestartAllCoreThreads() 可預創建。
  • maximumPoolSize:隊列滿且運行線程 < maximumPoolSize 時,創建非核心線程救急。
  • keepAliveTime/unit:非核心線程空閒超過此時間回收。
  • workQueue:阻塞隊列,四大常用實現:
    1. ArrayBlockingQueue:有界數組隊列,FIFO
    2. LinkedBlockingQueue:無界鏈表隊列,FIFO,吞吐量高,Executors.newFixedThreadPool() 默認使用
    3. SynchronousQueue:不存儲元素,直接移交,Executors.newCachedThreadPool() 默認使用
    4. PriorityBlockingQueue:優先級隊列
  • threadFactory:自定義線程命名,便於排查問題
  • handler:飽和策略,默認 AbortPolicy 拋異常。可選:CallerRunsPolicy(調用者執行)、DiscardOldestPolicy、DiscardPolicy

Executors 工廠方法快速創建

  • newFixedThreadPool(n):固定大小,LinkedBlockingQueue
  • newCachedThreadPool():可緩存,SynchronousQueue,適合大量短任務
  • newSingleThreadExecutor():單線程串行
  • newScheduledThreadPool(n):定時/周期任務,替代 Timer

任務提交與結果獲取

execute() - 無返回值

pool.execute(new Runnable() { public void run() { /* 任務 */ } });

submit() - 可獲取 Future 結果


ExecutorService executor = Executors.newCachedThreadPool();
List> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    futures.add(executor.submit(new Callable() {
        public String call() { return "Result-" + i; }
    }));
}
for (Future f : futures) {
    System.out.println(f.get()); // 阻塞獲取結果
}
executor.shutdown();

線程池關閉:shutdown vs shutdownNow

方法原理特點
shutdown()設置狀態 SHUTDOWN,中斷無任務線程,不接受新任務,等待隊列任務完成溫和關閉,推薦常規使用
shutdownNow()設置狀態 STOP,嘗試中斷所有線程(含執行中),返回未執行任務列表暴力關閉,任務可能未完成

調用任意關閉方法後 isShutdown() 返回 true;所有任務結束後 isTerminated() 返回 true。

任務執行流程圖解(四步走)

  1. 運行線程 < corePoolSize → 直接創建線程執行
  2. 線程數 ≥ corePoolSize → 任務入隊 workQueue
  3. 隊列滿且線程數 < maximumPoolSize → 創建非核心線程
  4. 以上均不滿足 → 執行 RejectedExecutionHandler 拒絕策略

定時任務:Timer 缺陷與 ScheduledThreadPoolExecutor 替代

Timer 兩大缺陷

  1. 單線程串行:一個耗時任務阻塞後續所有任務
  2. 異常終止線程:任務拋出未檢查異常導致 Timer 線程死亡,後續任務永不執行

ScheduledThreadPoolExecutor 完美解決


ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
executor.scheduleAtFixedRate(task1, 0, 1000, TimeUnit.MILLISECONDS);
executor.scheduleAtFixedRate(task2, 0, 4000, TimeUnit.MILLISECONDS);

多線程並行執行,單任務異常不影響其他任務,生產環境強烈推薦替代 Timer。

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