線程池的參數詳解以及狀態


一、ThreadPoolExecutor的重要參數

 1corePoolSize:核心線程數 * 核心線程會一直存活,及時沒有任務需要執行 * 當線程數小於核心線程數時,即使有線程空閑,線程池也會優先創建新線程處理 * 設置allowCoreThreadTimeout=true(默認false)時,核心線程會超時關閉 2queueCapacity:任務隊列容量(阻塞隊列) * 當核心線程數達到最大時,新任務會放在隊列中排隊等待執行 3maxPoolSize:最大線程數 * 當線程數>=corePoolSize,且任務隊列已滿時。線程池會創建新線程來處理任務 * 當線程數=maxPoolSize,且任務隊列已滿時,線程池會拒絕處理任務而拋出異常 4 keepAliveTime:線程空閑時間 * 當線程空閑時間達到keepAliveTime時,線程會退出,直到線程數量=corePoolSize * 如果allowCoreThreadTimeout=true,則會直到線程數量=0 5allowCoreThreadTimeout:允許核心線程超時 6rejectedExecutionHandler:任務拒絕處理器 * 兩種情況會拒絕處理任務: - 當線程數已經達到maxPoolSize,切隊列已滿,會拒絕新任務 - 當線程池被調用shutdown()后,會等待線程池里的任務執行完畢,再shutdown。如果在調用shutdown()和線程池真正shutdown之間提交任務,會拒絕新任務 * 線程池會調用rejectedExecutionHandler來處理這個任務。如果沒有設置默認是AbortPolicy,會拋出異常 * ThreadPoolExecutor類有幾個內部實現類來處理這類情況: - AbortPolicy 丟棄任務,拋運行時異常 - CallerRunsPolicy 執行任務 - DiscardPolicy 忽視,什么都不會發生 - DiscardOldestPolicy 從隊列中踢出最先進入隊列(最后一個執行)的任務 * 實現RejectedExecutionHandler接口,可自定義處理器

二、ThreadPoolExecutor執行順序

 線程池按以下行為執行任務 1. 當線程數小於核心線程數時,創建線程。 2. 當線程數大於等於核心線程數,且任務隊列未滿時,將任務放入任務隊列。 3. 當線程數大於等於核心線程數,且任務隊列已滿 - 若線程數小於最大線程數,創建線程 - 若線程數等於最大線程數,拋出異常,拒絕任務

三、如何設置參數

 1、默認值 * corePoolSize=1 * queueCapacity=Integer.MAX_VALUE * maxPoolSize=Integer.MAX_VALUE * keepAliveTime=60s * allowCoreThreadTimeout=false * rejectedExecutionHandler=AbortPolicy() 2、如何來設置 * 需要根據幾個值來決定 - tasks :每秒的任務數,假設為500~1000 - taskcost:每個任務花費時間,假設為0.1s - responsetime:系統允許容忍的最大響應時間,假設為1s * 做幾個計算 - corePoolSize = 每秒需要多少個線程處理? * threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100 個線程。corePoolSize設置應該大於50 * 根據8020原則,如果80%的每秒任務數小於800,那么corePoolSize設置為80即可 - queueCapacity = (coreSizePool/taskcost)*responsetime * 計算可得 queueCapacity = 80/0.1*1 = 80。意思是隊列里的線程可以等待1s,超過了的需要新開線程來執行 * 切記不能設置為Integer.MAX_VALUE,這樣隊列會很大,線程數只會保持在corePoolSize大小,當任務陡增時,不能新開線程來執行,響應時間會隨之陡增。 - maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost) * 計算可得 maxPoolSize = (1000-80)/10 = 92 * (最大任務數-隊列容量)/每個線程每秒處理能力 = 最大線程數 - rejectedExecutionHandler:根據具體情況來決定,任務不重要可丟棄,任務重要則要利用一些緩沖機制來處理 - keepAliveTimeallowCoreThreadTimeout采用默認通常能滿足 3 以上都是理想值,實際情況下要根據機器性能來決定。如果在未達到最大線程數的情況機器cpu load已經滿了,則需要通過升級硬件(呵呵)和優化代碼,降低taskcost來處理。

四、線程池的狀態以及拒絕策略

http://blog.sina.com.cn/s/blog_7be8a4cf0102ygu6.html


作者:如飢似渴的學習IN
鏈接:https://www.imooc.com/article/5887
來源:慕課網


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM