
| 參數(shù) | 意義 |
|---|---|
| corePoolsize | 線程池核心線程數(shù) |
| workQueue | 存放提交的task |
| maximumPoolSize | 線程池中允許最大線程數(shù) |
| threalFactory | 線程工廠,用于創(chuàng)建線程,由Excutors#defultThrealFactory實現(xiàn) |
| keepAliveTime | 空閑線程存活時間(默認是臨時線程,也可設置為核心線程) |
| unit | 空閑時間線程存活時間單位枚舉 |
線程池流程
1.當workers.size()小于corePoolSize時, 創(chuàng)建新的線程執(zhí)行提交的task
2.當workers.size()大于corePoolSize時, 并且workQueue沒有滿將task添加到workQueue.
3.當workers.size()大于corePoolSize時,并且workQueue已經(jīng)滿了,workers.size()<maximumPoolSize,就創(chuàng)建一個臨時線程處理task
4.當workers.size()大于corePoolSize時, 并且workQueue已經(jīng)滿了, 并且workers.size()>=maximumPoolSize, 執(zhí)行拒絕策略
4種默認的拒絕策略:
ThreadPoolExecutor默認實現(xiàn)的4種拒絕策略.
- AbortPolicy -- 當任務添加到線程池中被拒絕時,它將拋出 RejectedExecutionException 異常。
- CallerRunsPolicy -- 當任務添加到線程池中被拒絕時,會在線程池當前正在運行的Thread線程池中處理被拒絕的任務。
- DiscardOldestPolicy -- 當任務添加到線程池中被拒絕時,線程池會放棄等待隊列中最舊的未處理任務,然后將被拒絕的任務添加到等待隊列中。
- DiscardPolicy -- 當任務添加到線程池中被拒絕時,線程池將丟棄被拒絕的任務。
預定義線程池4種線程池
ThreadPoolExecutor提供了四個構(gòu)造方法:
image
- FixedThreadPool 固定大小的線程池
private final ExecutorService executorService = new ThreadPoolExecutor(10, 50,
60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), new ThreadFactoryBuilder()
.build(), new ThreadPoolExecutor.AbortPolicy());
適用場景:可用于Web服務瞬時削峰,但需注意長時間持續(xù)高峰情況造成的隊列阻塞。
- CachedThreadPool 可緩存線程池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
適用場景:快速處理大量耗時較短的任務,如Netty的NIO接受請求時,可使用CachedThreadPool。
- SingleThreadExecutor 單例線程池
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
適用場景:創(chuàng)建一個單線程的線程池,適用于需要保證順序執(zhí)行各個任務。
- ScheduledThreadPool 調(diào)度線程池
內(nèi)容比較多 可自行度娘