ThreadPoolExecutor

使用的常見 Executor 是 ThreadPoolExecutor,它負責執行緒處理。如果還有更多工作要做,你可以配置執行程式在沒有太多操作時必須維護的最小執行緒數(它稱為核心大小)和池可以增長的最大執行緒大小。一旦工作負載下降,Pool 會再次緩慢減少執行緒計數,直到達到最小值。

ThreadPoolExecutor pool = new ThreadPoolExecutor(
    1,                                     // keep at least one thread ready, 
                                           // even if no Runnables are executed
    5,                                     // at most five Runnables/Threads
                                           // executed in parallel
    1, TimeUnit.MINUTES,                   // idle Threads terminated after one
                                           // minute, when min Pool size exceeded
    new ArrayBlockingQueue<Runnable>(10)); // outstanding Runnables are kept here

pool.execute(new Runnable() {
    @Override public void run() {
        //code to run
    }
});

注意如果使用無界佇列配置 ThreadPoolExecutor ,則執行緒計數不會超過 corePoolSize,因為只有佇列已滿時才會建立新執行緒:

ThreadPoolExecutor 包含所有引數:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)

來自 JavaDoc

如果有多個 corePoolSize 但執行的 maximumPoolSize 執行緒少於 maximumPoolSize,則只有在佇列已滿時才會建立新執行緒。

好處:

  1. 可以控制 BlockingQueue 大小,並且可以避免記憶體不足的情況。有限的有界佇列大小不會降低應用程式效能。

  2. 你可以使用現有或建立新的拒絕處理程式策略。

    1. 在預設的 ThreadPoolExecutor.AbortPolicy 中,處理程式在拒絕時丟擲執行時 RejectedExecutionException。

    2. ThreadPoolExecutor.CallerRunsPolicy 中,呼叫 execute 本身的執行緒執行任務。這提供了一種簡單的反饋控制機制,可以降低新任務的提交速度。

    3. ThreadPoolExecutor.DiscardPolicy 中,簡單地刪除了無法執行的任務。

    4. ThreadPoolExecutor.DiscardOldestPolicy 中,如果執行程式未關閉,則會刪除工作佇列頭部的任務,然後重試執行(可能會再次失敗,導致重複執行)。

  3. 可以配置自定義 ThreadFactory,這很有用:

    1. 設定更具描述性的執行緒名稱
    2. 設定執行緒守護程式狀態
    3. 設定執行緒優先順序

以下是如何使用 ThreadPoolExecutor 的示例