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