java併發程式設計一一執行緒池原理分析(三)
合理的設定執行緒池的大小
接著上一篇探討執行緒留下的尾巴。如果合理的設定執行緒池的大小。
要想合理的配置執行緒池的大小、首先得分析任務的特性,可以從以下幾個角度分析:
1、任務的性質:CPU密集型任務、IO密集型任務、混合型任務等;
2、任務的優先順序:高、中、低;
3、任務的執行時間:長、中、短;
4、任務依賴性:是否依賴其它系統資源,如資料庫的連線等;
性質不同的任務可以交給不同規模的執行緒池執行。
對不不同性質的任務來說,CPU密集型任務應配置儘可能小的執行緒,如配置CPU個數+1 的執行緒數。IO密集型任務應配置儘可能多的執行緒,因為IO操作不佔用CPU,不用讓CPU閒下來,應加大執行緒數量。如配置兩倍CPU格式+1 ,而對於混合型的任務,如果可以拆分,拆分成IO密集型和CPU密集型分別處理,前提是兩者執行圖的時間差不多的,如果處理時間相差很大,則沒有必要拆分了。
若人物對其他系統資源有依賴,如某個任務依賴資料庫的連線返回的結果,這時候等待的時間越長,則CPU的空時間越長,那麼執行緒數量應設定的越大,才能更好的利用CPU。
當然具體合理的執行緒池的值大小,需要結合系統實際情況,在大量的嘗試下比較才能得出,以上只是前任總結的規律。
最佳執行緒數目 = ((執行緒等待時間+執行緒CPU時間)/ 執行緒CPU時間) CPU數目*
比如平均每個執行緒CPU執行時間為 0.5s ,而執行緒等待時間(非CPU執行時間,比如 IO)為1.5s,CPU核心數為8, 那麼根據上述公訴估算得出: ((0.5 + 1.5)/0.5) *8 =32。這個公式進一步轉化為:
最佳執行緒數目 = (執行緒等待時間與執行緒CPU時間之比 + 1) * CPU數目
可以得出一個結論:
執行緒等待的時間所佔比例越高,需要越多執行緒。執行緒CUP時間所佔比例越高,需要越少執行緒。
以上公式與之前的CPU和IO密集型任務設定執行緒數及本吻合。
CPU密集型時,任務可以少配置執行緒數,大概和及其的CPU核數相當,這樣可以使得每個執行緒都在執行任務;
IO密集型時,大部分執行緒都阻塞,故需要多配置執行緒數,2*CPU核數
作業系統之名稱解釋:
某些程序花費了絕大多數時間在計算上,而其他則在I/O上花費大多是時間
前者稱為計算機密集型(CPU密集型)computer-bound ,厚著稱為I/O密集型,I/O-bound。