線程池採用對象池思想:預創建線程存放池中,任務提交時復用線程,避免頻繁創建/銷毀開銷。Java 5 在 java.util.concurrent 提供完整實現,核心接口 ExecutorService,工廠類 Executors。
ExecutorService pool = Executors.newFixedThreadPool(2); // 核心=最大=2
// 提交5個任務,只會有2個線程並發執行,其餘排隊
pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5);
pool.shutdown();
輸出:pool-1-thread-1 執行4次,pool-1-thread-2 執行1次,體現線程復用。
ExecutorService pool = Executors.newSingleThreadExecutor(); // 單線程串行
所有任務由同一線程按順序執行,保證任務間無並發衝突。
ExecutorService pool = Executors.newCachedThreadPool(); // 按需創建,空閒60秒回收
適合大量短生命周期任務,無上限風險需謹慎使用。
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
pool.execute(task); // 立即執行
pool.schedule(task, 10, TimeUnit.MILLISECONDS); // 延遲10ms執行
pool.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS); // 週期執行
ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
BlockingQueue queue = new ArrayBlockingQueue<>(20);
ThreadPoolExecutor pool = new ThreadPoolExecutor(
2, // corePoolSize
3, // maximumPoolSize
2, TimeUnit.MILLISECONDS, // keepAliveTime
queue // workQueue
);
參數詳解:
corePoolSize:核心線程數(常駐)maximumPoolSize:最大線程數keepAliveTime:非核心線程空閒存活時間workQueue:任務隊列(有界/無界)自定義池可獲取運行指標:getPoolSize()、getActiveCount()、getQueue() 等。
CallerRunsPolicy 等ThreadFactory 便於排查shutdown() + awaitTermination() 確保任務完成