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