執行緒池構造詳解
阿新 • • 發佈:2021-06-20
Java中的Class ThreadPoolExecutor
public class ThreadPoolExecutor extends AbstractExecutorService
該類是執行緒池的核心類,使用執行緒池時就是例項化該類的過程,這個類提供了4個構造方法:
//建立一個新的 ThreadPoolExecutor與給定的初始引數和預設執行緒工廠和拒絕執行處理程式。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue); //建立一個新的 ThreadPoolExecutor與給定的初始引數和預設執行緒工廠。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler); //建立一個新的 ThreadPoolExecutor與給定的初始引數和預設拒絕執行處理程式。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory); //建立一個新 ThreadPoolExecutor給定的初始引數。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler);
引數詳解
構造方法中一共使用到了七個引數,含義分別為:
corePoolSize
- 即使空閒時仍保留在池中的執行緒數,除非設定allowCoreThreadTimeOut
maximumPoolSize
- 池中允許的最大執行緒數keepAliveTime
- 當執行緒數大於核心執行緒數時,這是多餘的空閒執行緒在終止前等待新任務的最大時間。unit
-keepAliveTime
引數的時間單位workQueue
- 用於在執行任務之前使用的佇列。 這個佇列將僅儲存execute
方法提交的Runnable
任務。threadFactory
- 執行程式建立新執行緒時使用的工廠handler
執行緒池工作順序
執行緒池的工作順序為:
- 執行緒池建立,準備好
corePoolSize
數量的核心執行緒,準備接收任務 - 當core滿了時,就將再進來的任務放入到阻塞佇列中,空閒的core執行緒就去自動去阻塞佇列獲取任務執行
- 當阻塞佇列滿了時,就去直接開新程序執行,最大隻能開到
maximumPoolSize
數量的執行緒 - 當開到最大執行緒數依然滿足不了任務數時,就會呼叫RejectedExecutionHandler拒絕任務
- 如果當前執行緒池具有多於
corePoolSize
執行緒,則如果空閒超過keepAliveTime
,則多餘的執行緒將被終止max執行緒都執行完成
拒絕策略
當執行程式對最大執行緒和工作佇列容量使用有限邊界並且飽和時,會觸發拒絕策略,RejectedExecutionHandler提供了四個預定義的處理程式策略:
-
預設ThreadPoolExecutor.AbortPolicy ,丟棄任務並丟擲異常。
-
在ThreadPoolExecutor.CallerRunsPolicy中,由呼叫execute本身的執行緒執行任務, 這提供了一個簡單的反饋控制機制,將降低新任務提交的速度。
-
在ThreadPoolExecutor.DiscardPolicy中 ,簡單地刪除無法執行的任務,但不丟擲異常。
-
在ThreadPoolExecutor.DiscardOldestPolicy中 ,如果執行程式沒有關閉,則工作佇列頭部的任務被刪除,然後重試執行(可能會再次失敗,導致重複)。