ThreadPoolExecutor介紹
通過 ThreadPoolExecutor 創建執行緒池,API 如下所示:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue);
先來解釋下其中的引數含義(如果看的比較模糊可以大致有個印象,后面的圖是關鍵),
-
corePoolSize
核心池的大小,在創建了執行緒池后,默認情況下,執行緒池中并沒有任何執行緒,而是等待有任務到來才創建執行緒去執行任務,除非呼叫了 prestartAllCoreThreads() 或者 prestartCoreThread() 方法,從這兩個方法的名字就可以看出,是預創建執行緒的意思,即在沒有任務到來之前就創建 corePoolSize 個執行緒或者一個執行緒,默認情況下,在創建了執行緒池后,執行緒池中的執行緒數為0,當有任務來之后,就會創建一個執行緒去執行任務,當執行緒池中的執行緒數目達到 corePoolSize 后,就會把到達的任務放到快取佇列當中,
-
maximumPoolSize
執行緒池最大執行緒數,這個引數也是一個非常重要的引數,它表示在執行緒池中最多能創建多少個執行緒,
-
keepAliveTime
表示執行緒沒有任務執行時最多保持多久時間會終止,默認情況下,只有當執行緒池中的執行緒數大于 corePoolSize 時,keepAliveTime 才會起作用,直到執行緒池中的執行緒數不大于 corePoolSize,即當執行緒池中的執行緒數大于 corePoolSize 時,如果一個執行緒空閑的時間達到 keepAliveTime,則會終止,直到執行緒池中的執行緒數不超過 corePoolSize,但是如果呼叫了 allowCoreThreadTimeOut(boolean) 方法,在執行緒池中的執行緒數不大于 corePoolSize 時,keepAliveTime 引數也會起作用,直到執行緒池中的執行緒數為0,
-
unit
引數 keepAliveTime 的時間單位, -
workQueue
一個阻塞佇列,用來存盤等待執行的任務,這個引數的選擇也很重要,會對執行緒池的運行程序產生重大影響,一般來說,這里的阻塞佇列有以下這幾種選擇:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue, -
threadFactory
執行緒工廠,主要用來創建執行緒, -
handler
表示當拒絕處理任務時的策略,有以下四種取值:ThreadPoolExecutor.AbortPolicy:丟棄任務并拋出 RejectedExecutionException 例外;
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不拋出例外;
ThreadPoolExecutor.DiscardOldestPolicy:丟棄佇列最前面的任務,然后重新嘗試執行任務(重復此程序);
ThreadPoolExecutor.CallerRunsPolicy:由呼叫執行緒處理該任務,
上面這些引數是如何配合作業的呢?請看下圖:

注意圖上面的序號,
簡單總結下執行緒池之間的引數協作分為以下幾步:
- 執行緒優先向 CorePool 中提交;
- 在 Corepool 滿了之后,執行緒被提交到任務佇列,等待執行緒池空閑;
- 在任務佇列滿了之后 corePool 還沒有空閑,那么任務將被提交到 maxPool 中,如果 MaxPool 滿了之后執行 task 拒絕策略,
執行緒數如何設定
其實這里主要是考察你對執行緒任務的理解和對系統設定時資源消耗的考慮了,因為為了保證系統的穩定性的同時,又需要盡可能地資源利用最大化,提高系統性能,這就需要考慮對執行緒數設定的計算調整,一般來說,執行緒數大小設定遵循如下規則:
最佳執行緒數目 =(( 執行緒等待時間 + 執行緒 CPU 時間 )/執行緒 CPU 時間 )* CPU 數目
但是其實這個公式也就是個參考值,一般我們通過這個計算出大體的最佳執行緒數,然后通過壓測再做對應的調整以找到真實的最佳執行緒數大小,
本文由猿必過 YBG 發布
禁止未經授權轉載,違者依法追究相關法律責任
如需授權可聯系:[email protected]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264716.html
標籤:其他
上一篇:基于keras實作的中文物體識別
