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,則只有在佇列已滿時才會建立新執行緒。
好處:
-
可以控制 BlockingQueue 大小,並且可以避免記憶體不足的情況。有限的有界佇列大小不會降低應用程式效能。
-
你可以使用現有或建立新的拒絕處理程式策略。
-
在預設的 ThreadPoolExecutor.AbortPolicy 中,處理程式在拒絕時丟擲執行時 RejectedExecutionException。
-
在
ThreadPoolExecutor.CallerRunsPolicy
中,呼叫 execute 本身的執行緒執行任務。這提供了一種簡單的反饋控制機制,可以降低新任務的提交速度。 -
在
ThreadPoolExecutor.DiscardPolicy
中,簡單地刪除了無法執行的任務。 -
在
ThreadPoolExecutor.DiscardOldestPolicy
中,如果執行程式未關閉,則會刪除工作佇列頭部的任務,然後重試執行(可能會再次失敗,導致重複執行)。
-
-
可以配置自定義
ThreadFactory
,這很有用:- 設定更具描述性的執行緒名稱
- 設定執行緒守護程式狀態
- 設定執行緒優先順序
以下是如何使用 ThreadPoolExecutor 的示例