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

