1. 程式人生 > 其它 >執行緒池建立方式

執行緒池建立方式

1.注意:Executors是不建議的

2.強制使用ThreadPoolExecutor

2.1

點選檢視程式碼
public ThreadPoolExecutor(int corePoolSize,
            int maximumPoolSize,
            long keepAliveTime,
            TimeUnit unit,
            BlockingQueue<Runnable> workQueue,
            ThreadFactory threadFactory,
            RejectedExecutionHandler handler)

其中的引數含義是:

corePoolSize:執行緒池中的執行緒數量;
maximumPoolSize:執行緒池中的最大執行緒數量;
keepAliveTime:當執行緒池執行緒數量超過corePoolSize時,多餘的空閒執行緒會在多長時間內被銷燬;
unit:keepAliveTime的時間單位;
workQueue:任務佇列,被提交但是尚未被執行的任務;
threadFactory:執行緒工廠,用於建立執行緒,一般情況下使用預設的,即Executors類的靜態方法defaultThreadFactory();handler:拒絕策略。當任務太多來不及處理時,如何拒絕任務。
對於這些引數要有以下了解:

COREPOOLSIZE與MAXIMUMPOOLSIZE的關係
首先corePoolSize肯定是 <= maximumPoolSize。

其他關係如下:
若當前執行緒池中執行緒數 < corePoolSize,則每來一個任務就建立一個執行緒去執行;
若當前執行緒池中執行緒數 >= corePoolSize,會嘗試將任務新增到任務佇列。如果新增成功,則任務會等待空閒執行緒將其取出並執行;
若佇列已滿,且當前執行緒池中執行緒數 < maximumPoolSize,建立新的執行緒;
若當前執行緒池中執行緒數 >= maximumPoolSize,則會採用拒絕策略(JDK提供了四種,下面會介紹到)。

workQueue

引數workQueue是指提交但未執行的任務佇列。若當前執行緒池中執行緒數>=corePoolSize時,就會嘗試將任務新增到任務佇列中。主要有以下幾種:

SynchronousQueue:直接提交佇列。SynchronousQueue沒有容量,所以實際上提交的任務不會被新增到任務佇列,總是將新任務提交給執行緒執行,如果沒有空閒的執行緒,則嘗試建立新的執行緒,如果執行緒數量已經達到最大值(maximumPoolSize),則執行拒絕策略。
LinkedBlockingQueue:無界的任務佇列。當有新的任務來到時,若系統的執行緒數小於corePoolSize,執行緒池會建立新的執行緒執行任務;當系統的執行緒數量等於corePoolSize後,因為是無界的任務佇列,總是能成功將任務新增到任務佇列中,所以執行緒數量不再增加。若任務建立的速度遠大於任務處理的速度,無界佇列會快速增長,直到記憶體耗盡。

handler

JDK內建了四種拒絕策略:

DiscardOldestPolicy策略:丟棄任務佇列中最早新增的任務,並嘗試提交當前任務;
CallerRunsPolicy策略:呼叫主執行緒執行被拒絕的任務,這提供了一種簡單的反饋控制機制,將降低新任務的提交速度。
DiscardPolicy策略:默默丟棄無法處理的任務,不予任何處理。
AbortPolicy策略:直接丟擲異常,阻止系統正常工作。
至此,我們直接new ThreadPoolExecutor類就不用慌了!!!!