線程池究竟設成多大是要看你給線程池處理什么樣的任務,任務類型不同,線程池大小的設置方式也是不同的。
任務一般可分為:CPU密集型、IO密集型、混合型,對於不同類型的任務需要分配不同大小的線程池。
- CPU密集型任務
盡量使用較小的線程池,一般為CPU核心數+1。
因為CPU密集型任務使得CPU使用率很高,若開過多的線程數,只能增加上下文切換的次數,因此會帶來額外的開銷。
- IO密集型任務
可以使用稍大的線程池,一般為2*CPU核心數。
IO密集型任務CPU使用率並不高,因此可以讓CPU在等待IO的時候去處理別的任務,充分利用CPU時間。
- 混合型任務
可以將任務分成IO密集型和CPU密集型任務,然后分別用不同的線程池去處理。
只要分完之后兩個任務的執行時間相差不大,那么就會比串行執行來的高效。
因為如果划分之后兩個任務執行時間相差甚遠,那么先執行完的任務就要等后執行完的任務,最終的時間仍然取決於后執行完的任務,而且還要加上任務拆分與合並的開銷,得不償失
- 對於計算密集型的程序,線程數應當等於核心數,但是再怎么計算密集,總有一些IO吧,所以再加一個線程來把等待IO的CPU時間利用起來
- 對於計算密集型的任務,在擁有N個處理器的系統上,當線程池的大小為N+1時,通常能實現最優的效率。(即使當計算密集型的線程偶爾由於缺失故障或者其他原因而暫停時,這個額外的線程也能確保CPU的時鍾周期不會被浪費。)