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