java四種線程池 大家如何估算線程池數(shù)量?
大家如何估算線程池數(shù)量?線程池的大小對系統(tǒng)的性能有一定的影響,過大或過小的線程數(shù)都不能起到最佳的系統(tǒng)性能,但是線程池大小的確定不需要非常精確。只要避開最大和最小條件,線程池的大小不會對性能產(chǎn)生太大的影
大家如何估算線程池數(shù)量?
線程池的大小對系統(tǒng)的性能有一定的影響,過大或過小的線程數(shù)都不能起到最佳的系統(tǒng)性能,但是線程池大小的確定不需要非常精確。只要避開最大和最小條件,線程池的大小不會對性能產(chǎn)生太大的影響。一般來說,要確定線程池的大小,需要考慮cpu的數(shù)量、內(nèi)存大小等因素。在《Java并發(fā)實踐》一書中,我們給出了一個估算線程池大小的經(jīng)驗公式:
公式:nthread=NCU*UCU*(1 W/C),每個字段的含義:
nthreads:線程數(shù)
ncpu:CPU數(shù),運行時.getRuntime(). Availableprocessors()
UCU:CPU利用率,在[0,1
]W/C范圍內(nèi):等待時間與計算時間的比值
實際上,我們需要區(qū)分計算密集型和IO密集型。
如果C是無限的,也就是說,它是計算密集型的,那么太多的線程是沒有意義的,因為它需要CPU計算,扮演太多的角色是沒有用的。
如果它是Io密集型的,它可以啟動更多線程,因為等待時間太長。
一個簡單的總結(jié)是:IO密集型多線程,計算密集型線程=CPU內(nèi)核更合適。