執行緒池學習

mic_saber發表於2019-03-19

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

先來看看建構函式的引數,解釋下:

  • corePoolSize         除非設定allowCoreThreadTimeOut,否則就是保留在池中的執行緒數(即使它們是空閒的)
  • maximumPoolSize    池中允許的最大執行緒數
  • keepAliceTime       當執行緒數大於corePoolSize時,這是多餘的空閒執行緒在終止新任務之前等待新任務的最長時間。
  • unit                         keepAliveTime引數的時間單位
  • workQueue            用於在任務執行前儲存任務的佇列。這個佇列只包含execute方法提交的可執行任務。
  • threadFactory        執行緒工廠
  • handler                  由於達到執行緒邊界和佇列容量而阻塞執行時使用的處理程式

1. 如果執行的執行緒小於corePoolSize,則嘗試用給定的命令作為第一個任務啟動一個新執行緒。
    對addWorker的呼叫原子性地檢查runState和workerCount,因此可以通過返回false來防止錯誤警報,因為錯誤警報會在不應該新增執行緒的時候新增執行緒。
2. 如果一個任務可以成功排隊,那麼我們仍然需要再次檢查是否應該新增一個執行緒(因為自上次檢查以來已有的執行緒已經死亡),或者池在進入這個方法後關閉。
    因此,我們重新檢查狀態,如果必要的話,如果停止,則回滾佇列;如果沒有,則啟動一個新執行緒。
3. 如果無法對任務排隊,則嘗試新增新執行緒。如果它失敗了,我們知道我們被關閉或飽和,所以拒絕任務。

相關文章