corePoolSize 線程池中的核心線程數(shù),當(dāng)提交一個(gè)任務(wù)時(shí),線程池創(chuàng)建一個(gè)新線程執(zhí)行任務(wù),直到當(dāng)前線程數(shù)等于corePoolSize, 即使有其他空閑線程能夠執(zhí)行新來的任務(wù), 也會(huì)繼續(xù)創(chuàng)建線程;如果當(dāng)前線程數(shù)為corePoolSize,繼續(xù)提交的任務(wù)被保存到阻塞隊(duì)列中,等待被執(zhí)行;如果執(zhí)行了線程池的prestartAllCoreThreads()方法,線程池會(huì)提前創(chuàng)建并啟動(dòng)所有核心線程。
workQueue 用來保存等待被執(zhí)行的任務(wù)的阻塞隊(duì)列,在JDK中提供了如下阻塞隊(duì)列:
ArrayBlockingQueue: 基于數(shù)組結(jié)構(gòu)的有界阻塞隊(duì)列,按FIFO排序任務(wù);LinkedBlockingQueue: 基于鏈表結(jié)構(gòu)的阻塞隊(duì)列,按FIFO排序任務(wù),吞吐量通常要高于ArrayBlockingQueue; SynchronousQueue: 一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,每個(gè)插入操作必須等到另一個(gè)線程調(diào)用移除操作,否則插入操作一直處于阻塞狀態(tài),吞吐量通常要高于LinkedBlockingQueue; PriorityBlockingQueue:具有優(yōu)先級的無界阻塞隊(duì)列;
LinkedBlockingQueue比ArrayBlockingQueue在插入刪除節(jié)點(diǎn)性能方面更優(yōu),但是二者在put(), take()任務(wù)的時(shí)均需要加鎖,SynchronousQueue使用無鎖算法,根據(jù)節(jié)點(diǎn)的狀態(tài)判斷執(zhí)行,而不需要用到鎖,其核心是Transfer.transfer().
maximumPoolSize 線程池中允許的最大線程數(shù)。如果當(dāng)前阻塞隊(duì)列滿了,且繼續(xù)提交任務(wù),則創(chuàng)建新的線程執(zhí)行任務(wù),前提是當(dāng)前線程數(shù)小于maximumPoolSize;當(dāng)阻塞隊(duì)列是無界隊(duì)列, 則maximumPoolSize則不起作用, 因?yàn)闊o法提交至核心線程池的線程會(huì)一直持續(xù)地放入workQueue.
keepAliveTime 線程空閑時(shí)的存活時(shí)間,即當(dāng)線程沒有任務(wù)執(zhí)行時(shí),該線程繼續(xù)存活的時(shí)間;默認(rèn)情況下,該參數(shù)只在線程數(shù)大于corePoolSize時(shí)才有用, 超過這個(gè)時(shí)間的空閑線程將被終止;
unit keepAliveTime的單位
threadFactory 創(chuàng)建線程的工廠,通過自定義的線程工廠可以給每個(gè)新建的線程設(shè)置一個(gè)具有識別度的線程名。默認(rèn)為DefaultThreadFactory
handler 線程池的飽和策略,當(dāng)阻塞隊(duì)列滿了,且沒有空閑的工作線程,如果繼續(xù)提交任務(wù),必須采取一種策略處理該任務(wù),線程池提供了4種策略;
AbortPolicy:直接拋出異常,默認(rèn)策略; CallerRunsPolicy: 用調(diào)用者所在的線程來執(zhí)行任務(wù);DiscardOldestPolicy:丟棄阻塞隊(duì)列中靠最前的任務(wù),并執(zhí)行當(dāng)前任務(wù); DiscardPolicy: 直接丟棄任務(wù);
當(dāng)然也可以根據(jù)應(yīng)用場景實(shí)現(xiàn)RejectedExecutionHandler接口,自定義飽和策略,如記錄日志或持久化存儲(chǔ)不能處理的任務(wù)。