線程的創(chuàng)建和銷毀都會(huì)消耗大量資源,就好像公司每天上午9點(diǎn)工作時(shí)就招進(jìn)一批員工,晚上6點(diǎn)干完活就辭退一批員工,這都會(huì)銷毀公司大量資源。所以合理利用 “池” 中固定、穩(wěn)定的線程是非常有必要的。
平和ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
ThreadPoolExecutor 構(gòu)造方法
ThreadPoolExecutor 共有四個(gè)構(gòu)造方法:
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue, ThreadFactory)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue, RejectedExecutionHandler)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue, ThreadFactory, RejectedExecutionHandler)
以最多參數(shù)的構(gòu)造方法為例進(jìn)行分析:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
// 核心線程池不能小于0
if (corePoolSize < 0 ||
// 最大池大小不能小于等于0
maximumPoolSize <= 0 ||
// 最大池大小不能小于核心池大小
maximumPoolSize < corePoolSize ||
// 存活時(shí)間不能小于0
keepAliveTime < 0)
// 否則將會(huì)拋出 IllegalArgumentException 非法參數(shù)異常
throw new IllegalArgumentException();
// 工作隊(duì)列、線程工廠、拒絕執(zhí)行的處理策略都不能為空,否則將會(huì)排除NPE空指針異常
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
1. 參數(shù) corePoolSize 核心線程池大小:
線程池中一直會(huì)存活該大小的線程數(shù),即使是沒有工作(任務(wù))需要執(zhí)行。除非設(shè)置 allowCoreThreadTimeOut 為 true ,線程池中的核心線程會(huì)超時(shí)關(guān)閉。
2. 參數(shù) maximumPoolSize 線程池最大大小:
線程池最大允許同時(shí)存活的線程的大小。
3. 參數(shù) keepAliveTime 線程空閑時(shí)間:
當(dāng)線程池中的線程空閑時(shí)間達(dá)到 keepAliveTime 時(shí),線程會(huì)被銷毀,僅保留 corePoolSize 大小線程,如果allowCoreThreadTimeOut 為 true ,則線程池中包含核心線程在內(nèi)空閑線程都會(huì)被銷毀。
4. 參數(shù) unit 時(shí)間單位:
keepAliveTime 的時(shí)間單位(枚舉類型)TimeUnit ,其可選單位有 TimeUnit.DAYS 天、TimeUnit.HOURS 小時(shí)、TimeUnit.MINUTES 分鐘、TimeUnit.SECONDS秒、TimeUnitMILLISECONDS.毫秒、TimeUnit.MICROSECONDS微秒、TimeUnit.NANOSECONDS納秒,常用的是秒。
5. 參數(shù) workQueue 任務(wù)隊(duì)列(工作隊(duì)列、緩存隊(duì)列):
當(dāng)任務(wù)所需的線程數(shù)達(dá)到核心線程數(shù) corePoolSize 時(shí),新任務(wù)會(huì)放在工作隊(duì)列中排隊(duì)(緩存)等待執(zhí)行。如果任務(wù)所需的線程數(shù)達(dá)到核心線程數(shù) corePoolSize 時(shí),并且工作隊(duì)列已滿時(shí),并且線程池最大大小 maximumPoolSize 大于 核心線程池大小 corePoolSize 時(shí),才會(huì)創(chuàng)建新的線程去處理任務(wù)。
經(jīng)常有個(gè)錯(cuò)覺,認(rèn)為當(dāng)任務(wù)所需的線程數(shù)達(dá)到線程池最大線程數(shù) maximumPoolSize 時(shí),新任務(wù)才會(huì)進(jìn)入工作隊(duì)列,這是不對(duì)的。
6. 參數(shù) threadFactory 線程工廠:
用于創(chuàng)建線程池中線程的工廠。創(chuàng)建線程時(shí),經(jīng)常會(huì)給這一批具有處理相同類型任務(wù)的線程命名和線程工廠命名(*線程工廠命名是指給poolName線程池命名,作為線程名稱的前綴prefix),以此來標(biāo)識(shí)線程的用處,在分析程序執(zhí)行信息或排查程序異常問題時(shí),非常有幫助。
7. 參數(shù) handler 拒絕處理策略:
線程池拒絕處理任務(wù)有一下兩者情況:
①. 當(dāng)線程池中的線程數(shù)達(dá)到核心池大小時(shí),并且任務(wù)隊(duì)列已滿,會(huì)使用拒絕處理策略;(此種情況就像工作臺(tái)上的工作量積累已滿,又沒有足夠的人員去處理,那么我們就可以拒絕處理新任務(wù)。)
②. 當(dāng)調(diào)用shutdown() 方法后,會(huì)等待線程池中正在執(zhí)行的任務(wù)執(zhí)行完畢,然后再關(guān)閉線程池,如果在調(diào)用 shutdown() 方法后(還未真正關(guān)閉時(shí)),緊接著又有新的任務(wù)提交時(shí),會(huì)使用拒絕處理策略。(此種情況就像工作到了下班時(shí)間,工作人員還在忙著手頭上剩余的工作,如果此時(shí)又新任務(wù)提交,那么我們就可以拒絕處理新任務(wù)。)
(當(dāng)然也可以不拒絕)
拒絕處理策略: