經過 ThreadPoolExecutor 建立線程池,API 以下所示:web
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue);
先來解釋下其中的參數含義(若是看的比較模糊能夠大體有個印象,後面的圖是關鍵)。緩存
corePoolSize性能
核心池的大小。在建立了線程池後,默認狀況下,線程池中並無任何線程,而是等待有任務到來才建立線程去執行任務,除非調用了 prestartAllCoreThreads() 或者 prestartCoreThread() 方法,從這兩個方法的名字就能夠看出,是預建立線程的意思,即在沒有任務到來以前就建立 corePoolSize 個線程或者一個線程。默認狀況下,在建立了線程池後,線程池中的線程數爲0,當有任務來以後,就會建立一個線程去執行任務,當線程池中的線程數目達到 corePoolSize 後,就會把到達的任務放到緩存隊列當中。ui
maximumPoolSize線程
線程池最大線程數,這個參數也是一個很是重要的參數,它表示在線程池中最多能建立多少個線程。rest
keepAliveTimecode
表示線程沒有任務執行時最多保持多久時間會終止。默認狀況下,只有當線程池中的線程數大於 corePoolSize 時,keepAliveTime 纔會起做用,直到線程池中的線程數不大於 corePoolSize,即當線程池中的線程數大於 corePoolSize 時,若是一個線程空閒的時間達到 keepAliveTime,則會終止,直到線程池中的線程數不超過 corePoolSize。可是若是調用了 allowCoreThreadTimeOut(boolean) 方法,在線程池中的線程數不大於 corePoolSize 時,keepAliveTime 參數也會起做用,直到線程池中的線程數爲0。blog
unit
參數 keepAliveTime 的時間單位。隊列
workQueue
一個阻塞隊列,用來存儲等待執行的任務,這個參數的選擇也很重要,會對線程池的運行過程產生重大影響,通常來講,這裏的阻塞隊列有如下這幾種選擇:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue。資源
threadFactory
線程工廠,主要用來建立線程。
handler
表示當拒絕處理任務時的策略,有如下四種取值:
ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出 RejectedExecutionException 異常;
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,可是不拋出異常;
ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,而後從新嘗試執行任務(重複此過程);
ThreadPoolExecutor.CallerRunsPolicy:由調用線程處理該任務。
上面這些參數是如何配合工做的呢?請看下圖:
注意圖上面的序號。
簡單總結下線程池之間的參數協做分爲如下幾步:
其實這裏主要是考察你對線程任務的理解和對系統設置時資源消耗的考慮了。由於爲了保證系統的穩定性的同時,又須要儘量地資源利用最大化,提升系統性能。這就須要考慮對線程數設置的計算調整。通常來講,線程數大小設置遵循以下規則:
最佳線程數目 =(( 線程等待時間 + 線程 CPU 時間 )/線程 CPU 時間 )* CPU 數目
可是其實這個公式也就是個參考值,通常咱們經過這個計算出大致的最佳線程數,而後經過壓測再作對應的調整以找到真實的最佳線程數大小。
本文由猿必過 YBG 發佈 禁止未經受權轉載,違者依法追究相關法律責任 如需受權可聯繫:zhuyunhui@yuanbiguo.com