【threadpoolexecutor】在Java并發(fā)編程中,`ThreadPoolExecutor` 是一個非常重要的類,屬于 `java.util.concurrent` 包。它是 Java 線程池的核心實現(xiàn)之一,用于管理一組線程來執(zhí)行任務(wù),提高系統(tǒng)資源的利用率和響應(yīng)速度。
一、總結(jié)
`ThreadPoolExecutor` 是 Java 中用于創(chuàng)建線程池的類,允許開發(fā)者控制線程的數(shù)量、任務(wù)隊列、拒絕策略等。它通過復(fù)用線程來減少線程創(chuàng)建和銷毀的開銷,適用于需要處理大量短生命周期任務(wù)的場景。使用 `ThreadPoolExecutor` 可以提升程序性能,同時避免因線程過多而導(dǎo)致的資源浪費。
二、關(guān)鍵屬性與配置說明
屬性名 | 類型 | 說明 |
corePoolSize | int | 線程池中保持的最小線程數(shù),即使這些線程處于空閑狀態(tài)。 |
maximumPoolSize | int | 線程池中允許的最大線程數(shù)。 |
keepAliveTime | long | 當(dāng)線程數(shù)超過 corePoolSize 時,多余的空閑線程等待新任務(wù)的最長時間。 |
unit | TimeUnit | keepAliveTime 的時間單位(如秒、毫秒等)。 |
workQueue | BlockingQueue | 用于保存待執(zhí)行任務(wù)的阻塞隊列。 |
threadFactory | ThreadFactory | 用于創(chuàng)建新線程的工廠對象。 |
handler | RejectedExecutionHandler | 當(dāng)任務(wù)被拒絕時的處理策略。 |
三、常見使用方式
1. 使用默認構(gòu)造函數(shù)
通過 `new ThreadPoolExecutor(...)` 手動設(shè)置參數(shù)。
2. 使用 Executors 工廠方法
- `Executors.newFixedThreadPool(int nThreads)`:固定大小的線程池。
- `Executors.newCachedThreadPool()`:根據(jù)需要創(chuàng)建新線程,適合短任務(wù)。
- `Executors.newSingleThreadExecutor()`:單線程的線程池。
- `Executors.newScheduledThreadPool(int corePoolSize)`:支持定時任務(wù)的線程池。
四、線程池的工作流程
1. 當(dāng)任務(wù)提交到線程池時,首先嘗試將任務(wù)加入工作隊列。
2. 如果隊列已滿,則嘗試創(chuàng)建新線程(不超過 maximumPoolSize)。
3. 如果無法創(chuàng)建新線程,則觸發(fā)拒絕策略。
五、拒絕策略(RejectedExecutionHandler)
策略 | 說明 |
AbortPolicy | 拋出 `RejectedExecutionException` 異常。 |
CallerRunsPolicy | 由調(diào)用線程直接執(zhí)行該任務(wù)。 |
DiscardPolicy | 直接丟棄任務(wù),不拋出異常。 |
DiscardOldestPolicy | 丟棄隊列中最老的任務(wù),然后重試添加當(dāng)前任務(wù)。 |
六、適用場景
- 高并發(fā)請求處理(如 Web 服務(wù)器)
- 后臺任務(wù)調(diào)度
- 多任務(wù)并行處理
- 避免頻繁創(chuàng)建和銷毀線程
七、注意事項
- 合理設(shè)置 corePoolSize 和 maximumPoolSize,避免資源浪費或性能下降。
- 使用合適的隊列類型(如 `LinkedBlockingQueue`、`SynchronousQueue`)。
- 根據(jù)業(yè)務(wù)需求選擇合適的拒絕策略。
- 注意線程安全問題,避免共享資源競爭。
通過合理使用 `ThreadPoolExecutor`,可以顯著提升 Java 應(yīng)用的并發(fā)能力和穩(wěn)定性,是構(gòu)建高性能服務(wù)的重要工具之一。