Executors創建四種線程池:
CachedThreadPool:可緩存的線程池,該線程池中沒有核心線程,非核心線程的數量為Integer.max_value,當有需要時創建線程來執行任務,沒有需要時回收線程,適用於耗時少,任務量大的情況。
ScheduledThreadPool:周期性執行任務的線程池,按照某種特定的計划執行線程中的任務,有核心線程,但也有非核心線程,非核心線程的大小也為無限大。適用於執行周期性的任務。
SingleThreadPool:只有一條線程來執行任務,適用於有順序的任務的應用場景。
FixedThreadPool:定長的線程池,有核心線程,核心線程的即為最大的線程數量。
創建方式
public class ThreadPoolDemo {
public static void main(String[] args) {
Executors.newFixedThreadPool(3);
Executors.newCachedThreadPool();
Executors.newScheduledThreadPool(3);
Executors.newSingleThreadExecutor();
}
}
實際開發中采用ThreadPoolExecutor創建線程池:
原因:
- FixedThreadPool和SingleThreadExecutor => 允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而引起OOM異常
- CachedThreadPool => 允許創建的線程數為Integer.MAX_VALUE,可能會創建大量的線程,從而引起OOM異常
創建方式
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
ThreadPoolExecutor參數說明:
corePoolSize : 線程池核心池的大小
maximumPoolSize : 線程池的最大線程數
keepAliveTime :線程最大空閑時間
unit : 時間單位
workQueue : 用來儲存等待執行任務的隊列
threadFactory : 線程工廠
handler :拒絕策略
四種拒絕策略
當提交任務數大於 corePoolSize 的時候,會優先將任務放到 workQueue 阻塞隊列中。當阻塞隊列飽和后,會擴充線程池中線程數,直到達到 maximumPoolSize 最大線程數配置。此時,再多余的任務,則會觸發線程池的拒絕策略了。
- AbortPolicy - 丟棄任務,並拋出拒絕執行 RejectedExecutionException 異常信息。線程池默認的拒絕策略。必須處理好拋出的異常,否則會打斷當前的執行流程,影響后續的任務執行。
- CallerRunsPolicy-由調用者線程執行
- DiscardPolicy - 直接丟棄
- DiscardOldestPolicy - 當觸發拒絕策略,只要線程池沒有關閉的話,丟棄阻塞隊列 workQueue 中最老的一個任務,並將新任務加入