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

Java 線程池實現原理、JDK 內置池、Spring 整合與避坑指南

     編輯:Java 綜合教學

Java 線程池實現原理、JDK 內置池、Spring 整合與避坑指南

為什麼需要線程池

  • 頻繁創建/銷毀線程開銷大(分配棧、進入 OS 調度);
  • 活躍線程佔用記憶體、CPU 切換上下文;
  • 無限制創建導致 OOM 或抖動。池化可復用線程、限制併發、平滑削峰。

手寫簡易線程池

核心組件:LinkedList<Runnable> workQueue + 固定數量 WorkThread。execute() 入隊 + notify();getTask() 阻塞取任務;close() 清隊列+中斷線程;join() 等待任務執行完再關閉。

public class MyThreadPool extends ThreadGroup {
    private final LinkedList<Runnable> workQueue = new LinkedList<>();
    private boolean isClosed = false;

    public MyThreadPool(int poolSize) { ... for(i) new WorkThread().start(); }

    public synchronized void execute(Runnable task) { ... workQueue.add(task); notify(); }
    protected synchronized Runnable getTask() throws InterruptedException { ... wait(); return workQueue.removeFirst(); }
    public synchronized void close() { isClosed=true; workQueue.clear(); interrupt(); }
    public void join() { ... enumerate threads; each.join(); }

    class WorkThread extends Thread {
        public void run() { while(!isInterrupted()) { Runnable t = getTask(); if(t!=null) t.run(); else break; } }
    }
}

JDK 內置線程池體系

ExecutorService ← ThreadPoolExecutor ← ScheduledThreadPoolExecutor。核心參數:corePoolSize、maximumPoolSize、keepAliveTime、workQueue、ThreadFactory、RejectedExecutionHandler。常用工廠方法:Executors.newFixedThreadPool()、newCachedThreadPool()、newSingleThreadExecutor()、newScheduledThreadPool()。

Spring 整合 ThreadPoolTaskExecutor

<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="${threadpool.corePoolSize}"/>
    <property name="maxPoolSize" value="${threadpool.maxPoolSize}"/>
    <property name="queueCapacity" value="${threadpool.queueCapacity}"/>
    <property name="keepAliveSeconds" value="${threadpool.keepAliveSeconds}"/>
</bean>

注入 Service 中:@Autowired ExecutorService executor; 即可 executor.execute(() -> ...)。

五大避坑指南

風險成因對策
死鎖線程互相等待鎖/任務等待子任務但池已滿避免任務內同步調用同池任務;拆分專用池
資源耗盡核心數過大、隊列無界有界隊列 + 拒絕策略 + 監控指標
併發錯誤wait/notify 使用不當丟失喚醒優先用 JDK 成熟實現,少寫鎖代碼
線程洩漏任務拋出未捕獲異常導致工作線程死亡任務包裹 try-catch + Thread.setDefaultUncaughtExceptionHandler
任務過載隊列堆積大量耗時任務異步拒絕、降級、剝離 IO 密集型任務至專用池

原則:有界、隔離、可觀測、優雅關閉。

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