1. 程式人生 > 其它 >執行緒池構造詳解

執行緒池構造詳解

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
    - 執行被阻止時使用的處理程式,因為達到執行緒限制和佇列容量

執行緒池工作順序

執行緒池的工作順序為:

  1. 執行緒池建立,準備好corePoolSize數量的核心執行緒,準備接收任務
  2. 當core滿了時,就將再進來的任務放入到阻塞佇列中,空閒的core執行緒就去自動去阻塞佇列獲取任務執行
  3. 當阻塞佇列滿了時,就去直接開新程序執行,最大隻能開到maximumPoolSize數量的執行緒
  4. 當開到最大執行緒數依然滿足不了任務數時,就會呼叫RejectedExecutionHandler拒絕任務
  5. 如果當前執行緒池具有多於corePoolSize執行緒,則如果空閒超過keepAliveTime,則多餘的執行緒將被終止max執行緒都執行完成

拒絕策略

當執行程式對最大執行緒和工作佇列容量使用有限邊界並且飽和時,會觸發拒絕策略,RejectedExecutionHandler提供了四個預定義的處理程式策略:

  • 預設ThreadPoolExecutor.AbortPolicy ,丟棄任務並丟擲異常。

  • 在ThreadPoolExecutor.CallerRunsPolicy中,由呼叫execute本身的執行緒執行任務, 這提供了一個簡單的反饋控制機制,將降低新任務提交的速度。

  • 在ThreadPoolExecutor.DiscardPolicy中 ,簡單地刪除無法執行的任務,但不丟擲異常。

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