java線程池參數(shù)舉例詳解(附詳細代碼)
前言
Java 線程池是通過 java.util.concurrent
提供的 Executor 框架實現(xiàn)的。線程池主要由 ThreadPoolExecutor
類支持,它提供了靈活的配置參數(shù),允許開發(fā)者根據(jù)需求調(diào)整線程池的行為和性能。
1. 線程池的構(gòu)造方法
ThreadPoolExecutor
提供了一個核心構(gòu)造方法,允許指定線程池的關(guān)鍵參數(shù):
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler )
2. 線程池參數(shù)解析
2.1 核心參數(shù)
1. corePoolSize
- 定義:
- 核心線程數(shù),即線程池中始終保持存活的線程數(shù)量。
- 即使線程池處于空閑狀態(tài),核心線程也不會被回收(默認情況下)。
- 作用:
- 在任務量較少時,線程池會優(yōu)先創(chuàng)建核心線程來執(zhí)行任務。
- 配置建議:
- 根據(jù)系統(tǒng)負載和任務特性設(shè)置。
2. maximumPoolSize
- 定義:
- 線程池中允許的最大線程數(shù)(包括核心線程)。
- 當任務隊列滿時,線程池會繼續(xù)創(chuàng)建非核心線程,直到達到最大線程數(shù)。
- 作用:
- 控制線程池的最大并發(fā)能力。
- 配置建議:
- 設(shè)置為合適的值以避免線程過多導致系統(tǒng)資源耗盡。
3. keepAliveTime
- 定義:
- 非核心線程的存活時間(當線程處于空閑狀態(tài)時)。
- 超過此時間未執(zhí)行任務的非核心線程會被銷毀。
- 作用:
- 控制線程池資源的回收效率。
- 配置建議:
- 對于需要快速響應的線程池,可設(shè)置較短的存活時間。
4. unit
- 定義:
keepAliveTime
的時間單位。- 取值范圍為
TimeUnit
枚舉,包括:TimeUnit.MILLISECONDS
(毫秒)TimeUnit.SECONDS
(秒)TimeUnit.MINUTES
(分鐘)
- 作用:
- 規(guī)范存活時間的粒度。
5. workQueue
- 定義:
- 一個阻塞隊列,用于存儲等待執(zhí)行的任務。
- 如果線程池中的線程數(shù)已達到
corePoolSize
,新任務會被加入隊列等待。
常用隊列類型
- ArrayBlockingQueue:
- 有界隊列,必須指定容量。
- 當隊列滿時,新任務會觸發(fā)線程池擴容。
- LinkedBlockingQueue:
- 無界隊列(理論上容量無限制)。
- 如果使用無界隊列,
maximumPoolSize
參數(shù)將失效。
- SynchronousQueue:
- 不存儲任務的隊列,每次提交的任務必須直接交給線程處理。
- 如果沒有空閑線程,線程池會立即創(chuàng)建新線程。
- PriorityBlockingQueue:
- 支持任務排序的隊列。
- 提交的任務會根據(jù)優(yōu)先級排序。
6. threadFactory
- 定義:
- 用于創(chuàng)建線程的工廠類。
- 作用:
- 可以自定義線程名稱、線程優(yōu)先級、是否為守護線程等。
- 示例:
ThreadFactory factory = r -> { Thread thread = new Thread(r); thread.setName("CustomThread-" + thread.getId()); return thread; };
7. handler
- 定義:
- 拒絕策略,表示當線程池無法接受新任務時的處理方式。
- 觸發(fā)場景:
- 當任務隊列已滿且線程池中的線程數(shù)已達到
maximumPoolSize
時。
- 當任務隊列已滿且線程池中的線程數(shù)已達到
- 常見策略(
RejectedExecutionHandler
接口實現(xiàn)):AbortPolicy
(默認):- 拋出
RejectedExecutionException
異常。
CallerRunsPolicy
:- 由提交任務的線程直接執(zhí)行任務。
DiscardPolicy
:- 丟棄任務,不拋出異常。
DiscardOldestPolicy
:- 丟棄最早的任務(隊列頭部任務),然后重新嘗試提交新任務。
- 拋出
2.2 線程池的工作流程
- 提交任務:
- 任務通過
execute()
或submit()
方法提交到線程池。
- 任務通過
- 任務處理:
- 如果線程數(shù)未達到
corePoolSize
,創(chuàng)建新線程處理任務。 - 如果線程數(shù)已達到
corePoolSize
,任務進入workQueue
等待。 - 如果隊列已滿,且線程數(shù)小于
maximumPoolSize
,創(chuàng)建新線程處理任務。 - 如果隊列已滿,且線程數(shù)達到
maximumPoolSize
,觸發(fā)拒絕策略。
- 如果線程數(shù)未達到
- 線程回收:
- 超過
keepAliveTime
未使用的非核心線程會被銷毀。
- 超過
3. 常用線程池實現(xiàn)
Java 提供了一些線程池的便捷方法:
3.1 Executors 工廠方法
newFixedThreadPool(int nThreads)
:- 固定大小的線程池。
- 核心線程數(shù)和最大線程數(shù)相等,使用無界隊列。
ExecutorService fixedPool = Executors.newFixedThreadPool(5);
newCachedThreadPool()
:- 可緩存線程池。
- 線程池大小無限制,線程空閑超過 60 秒會被回收。
ExecutorService cachedPool = Executors.newCachedThreadPool();
newSingleThreadExecutor()
:- 單線程的線程池。
- 保證任務按提交順序執(zhí)行。
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
newScheduledThreadPool(int corePoolSize)
:- 支持定時和周期性任務的線程池。
ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(5);
3.2 自定義線程池
通過 ThreadPoolExecutor
構(gòu)造一個自定義線程池:
ExecutorService customPool = new ThreadPoolExecutor( 2, // 核心線程數(shù) 4, // 最大線程數(shù) 60, // 非核心線程存活時間 TimeUnit.SECONDS, // 存活時間單位 new ArrayBlockingQueue<>(10), // 阻塞隊列 Executors.defaultThreadFactory(), // 默認線程工廠 new ThreadPoolExecutor.AbortPolicy() // 拒絕策略 );
4. 參數(shù)配置的優(yōu)化建議
4.1 核心線程數(shù)(corePoolSize)
- I/O 密集型任務:
- 核心線程數(shù)通常設(shè)置為 2 * CPU 核心數(shù)。
- 任務需要頻繁等待外部資源(如磁盤、網(wǎng)絡),線程數(shù)可以適當增加。
- CPU 密集型任務:
- 核心線程數(shù)設(shè)置為 CPU 核心數(shù) + 1。
- 線程數(shù)過多會增加上下文切換的開銷。
4.2 最大線程數(shù)(maximumPoolSize)
- 線程池的大小應在系統(tǒng)資源允許范圍內(nèi),避免線程數(shù)過多導致資源耗盡。
4.3 隊列類型(workQueue)
- 短任務隊列:
- 使用
SynchronousQueue
,不存儲任務,適合高吞吐場景。
- 使用
- 有限任務隊列:
- 使用
ArrayBlockingQueue
限制隊列長度,防止內(nèi)存溢出。
- 使用
- 優(yōu)先級隊列:
- 使用
PriorityBlockingQueue
,適合需要任務排序的場景。
- 使用
4.4 拒絕策略(handler)
- 高可靠性:
- 使用
CallerRunsPolicy
,將任務回退到調(diào)用線程執(zhí)行。
- 使用
- 低優(yōu)先級任務:
- 使用
DiscardPolicy
或DiscardOldestPolicy
丟棄任務。
- 使用
5. 示例代碼
import java.util.concurrent.*; public class ThreadPoolExample { public static void main(String[] args) { ExecutorService threadPool = new ThreadPoolExecutor( 2, // 核心線程數(shù) 4, // 最大 線程數(shù) 60L, // 空閑線程存活時間 TimeUnit.SECONDS, // 時間單位 new LinkedBlockingQueue<>(10), // 阻塞隊列 Executors.defaultThreadFactory(), // 線程工廠 new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略 ); for (int i = 0; i < 20; i++) { threadPool.execute(() -> { System.out.println(Thread.currentThread().getName() + " is executing"); }); } threadPool.shutdown(); } }
6. 總結(jié)
參數(shù) | 作用 | 優(yōu)化建議 |
---|---|---|
corePoolSize | 核心線程數(shù),始終存活的線程數(shù) | 根據(jù)任務類型和系統(tǒng)資源合理設(shè)置 |
maximumPoolSize | 最大線程數(shù),限制線程池最大并發(fā)量 | 避免設(shè)置過高,防止資源耗盡 |
keepAliveTime | 非核心線程的存活時間 | 根據(jù)響應需求調(diào)整 |
workQueue | 等待任務隊列,存儲未處理的任務 | 使用合適的隊列類型 |
handler | 拒絕策略,決定任務無法處理時的行為 | 根據(jù)任務重要性選擇合適的策略 |
通過合理配置線程池參數(shù),可以顯著提升多線程程序的性能和資源利用率。
到此這篇關(guān)于java線程池參數(shù)舉例詳解的文章就介紹到這了,更多相關(guān)java線程池參數(shù)詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)把對象數(shù)組通過excel方式導出的功能
本文主要介紹了java實現(xiàn)把對象數(shù)組通過excel方式導出的功能的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧2017-03-03java面向?qū)ο笤O(shè)計原則之接口隔離原則示例詳解
這篇文章主要為大家介紹了java面向?qū)ο笤O(shè)計原則之接口隔離原則的示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步早日升職加薪2021-10-10利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的全過程
最近遇到個需求,需要將圖片在前端上傳到服務器進行保存,然后讀取到前端進行展示,這篇文章主要給大家介紹了關(guān)于利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的相關(guān)資料,需要的朋友可以參考下2023-04-04