一、核心參數
1、corePoolSize
核心池的大小,即線程池維護線程的最少數量。當提交一個任務到線程池時,線程池會創建一個線程來執行任務,即使其他線程處於空閑狀態。如果池中的線程數達到corePoolSize後,新提交的任務將被放入隊列中等待。如果隊列已滿,且池中的線程數小於maximumPoolSize,則創建新的線程執行任務。如果池中的線程數達到maximumPoolSize,則根據設置的拒絕策略來處理任務。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
2、maximumPoolSize
線程池最大數量。當線程池中的線程數目達到這個數目時,新的任務會被放入隊列中等待。如果隊列滿了,調用者就必須自己處理這個任務。如果使用無界的任務隊列這個參數就沒有任何作用。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
3、keepAliveTime
線程池中工作線程空閑後,保持存活的時間。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
二、任務隊列參數
1、workQueue
任務隊列,用來存儲等待執行的任務。常用的有四種隊列:
// 線程池中任務隊列為SynchronousQueue
ThreadPoolExecutor threadPoolExecutor1 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
// 線程池中任務隊列為LinkedBlockingQueue
ThreadPoolExecutor threadPoolExecutor2 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
// 線程池中任務隊列為ArrayBlockingQueue
ThreadPoolExecutor threadPoolExecutor3 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
// 線程池中任務隊列為PriorityBlockingQueue
ThreadPoolExecutor threadPoolExecutor4 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>());
2、capacity
任務隊列的容量。如果任務數量達到這個值,新提交的任務將會被拒絕,並根據設置的拒絕策略來處理任務。
// 容量為100的有界隊列
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
三、超時策略參數
1、allowCoreThreadTimeOut
該屬性為true時,表示樣品允許為核心線程設置超時時間,即當線程數大於核心線程數時,核心線程也會參與超時檢查。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); threadPoolExecutor.allowCoreThreadTimeOut(true);
2、rejectedExecutionHandler
當線程池中的資源已經全部使用,添加新線程被拒絕時,會進行拒絕處理。常用的拒絕策略有四種:
// 拒絕策略為AbortPolicy
ThreadPoolExecutor threadPoolExecutor1 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.AbortPolicy());
// 拒絕策略為DiscardPolicy
ThreadPoolExecutor threadPoolExecutor2 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardPolicy());
// 拒絕策略為DiscardOldestPolicy
ThreadPoolExecutor threadPoolExecutor3 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy());
// 拒絕策略為CallerRunsPolicy
ThreadPoolExecutor threadPoolExecutor4 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
四、線程池擴展參數
1、ThreadFactory
通過ThreadFactory方式自定義線程池中的線程對象,可以自定義線程的名字、是否為守護線程等。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {
private final AtomicInteger atomicInteger = new AtomicInteger(0);
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("Thread-" + atomicInteger.getAndIncrement());
return thread;
}
});
2、beforeExecute和afterExecute
在每個任務之前和之後執行的操作。可以用來統計任務的執行時間等。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.AbortPolicy());
threadPoolExecutor.setThreadFactory(new ThreadFactory() {
private final AtomicInteger atomicInteger = new AtomicInteger(0);
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("Thread-" + atomicInteger.getAndIncrement());
return thread;
}
});
// 執行任務前處理
threadPoolExecutor.prestartAllCoreThreads();
threadPoolExecutor.execute(() -> {
// 任務執行時間統計
long startTime = System.currentTimeMillis();
try {
// 執行任務
} finally {
// 任務執行時間統計
long endTime = System.currentTimeMillis();
log.info("任務執行時間: " + (endTime - startTime) + " ms");
}
});
五、總結
本文主要對Java線程池中的主要參數進行了詳細的闡述,包括核心參數、任務隊列參數、超時策略參數以及線程池擴展參數。在使用線程池時,需要根據具體業務場景選擇合適的參數配置,避免線程池資源浪費或者任務無法及時執行的情況。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297800.html
微信掃一掃
支付寶掃一掃