當前位置:網站首頁>ThreadPoolExecutor 參數詳解

ThreadPoolExecutor 參數詳解

2022-01-27 01:42:48 skyline_wx

我們看下ThreadPoolExecutor參數最多的構造器:

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

首先需要說明的是,當我們通過new ThreadPooExecutor創建了一個線程池之後,jvm並不會馬上將線程池中的線程創建出來。線程池中的線程是按需創建的。接下來我們逐一說明上面的這些參數:

  1. corePoolSize 核心線程數,每當用戶像線程池提交一個任務時,如果當前線程池中的線程數<corePoolSize,那麼線程池就會創建一個新的線程來執行這個任務,一般來說核心線程是不會消亡的。
  2. maximumPoolSize 線程池中允許的最大線程數,這個數需要大於等於corePoolSize,當workQueue已滿,且當前線程數小於maximumPoolSize時,線程池會創建備用線程來執行任務。
  3. keepAliveTime 空閑時間,這個時間一般說的是maximumPoolSize-corePoolSize的線程的空閑時間,但是如果設置了allowCoreThreadTimeOut(true),那麼這空閑時間也是核心線程的空閑時間。
  4. unit 上面那個keepAliveTime的單比特。
  5. workQueue 任務隊列,只要是阻塞隊列就行,但是沒有特殊情况的話,最好不好要用無界阻塞隊列或者長度非常非常大的阻塞隊列,容易導致任務堆積最後可能會OOM,這裏多說一句,理想情况下,隊列中的任務會慢慢的被線程池中的線程消耗掉,但是在實際項目上,可能會有GC、CPU時間片不足等原因導致任務沒那麼容易被消化
  6. threadFactory 典型的工廠模式,Thread創建工廠。線程池通過回調java.util.concurrent.ThreadFactory#newThread來創建一個新的工廠,我覺得主要的用途是為thread命名,方便後續排查
  7. handler 拒絕策略,典型的策略模式。當workQueue已滿並且線程池中的線程數已經到達maximumPoolSize時,線程池會回調java.util.concurrent.RejectedExecutionHandler#rejectedExecution讓用戶來决定該如何處理,這個參數建議還是自行處理,不要交給默認實現處理,默認實現用的是defaultHandler是AbortPolicy,即拋出异常並丟弃當前任務

版權聲明
本文為[skyline_wx]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201270142476522.html

隨機推薦