java是什么 java多線程ExecutorService線程數(shù)量?
java多線程ExecutorService線程數(shù)量?新增了一個Executors工廠類產(chǎn)生線程池,如下面幾個方法- public static ExecutorService newFixedThr
java多線程ExecutorService線程數(shù)量?
新增了一個Executors工廠類產(chǎn)生線程池,如下面幾個方法
- public static ExecutorService newFixedThreadPool(int nThreads)
- public static ExecutorService newSingleThreadExecutor()這些方法的返回值是ExecutorService對象,該對象表示一個線程池,可以執(zhí)行Runnable對象或者Callable對象代表的線程。它提供了如下方法:
- Future<?> submit(Runnable task)
- <T> Future<T> submit(Callable<T> task)
大家如何估算線程池數(shù)量?
線程池的大小對系統(tǒng)的性能有一定的影響,過大或者過小的線程數(shù)量都無法發(fā)揮最優(yōu)的系統(tǒng)性能,但是線程池大小的確定也不需要做的非常精確。因為只要避免極大和極小兩種情況,線程池的大小對性能的影響都不會影響太大,一般來說,確定線程池的大小需要考慮CPU數(shù)量,內(nèi)存大小等因素,在《Java Concurrency in Practice》 書中給出了一個估算線程池大小的經(jīng)驗公式:
公式:Nthread = Ncpu * Ucpu * (1 W/C),各字段含義:
Nthreads:線程數(shù)量
Ncpu:CPU的數(shù)量,Runtime.getRuntime().availableProcessors()
Ucpu:CPU使用率,范圍在[0,1]
W/C:等待時間與計算時間的比率
其實就是要分清是計算密集型還是IO密集型。
如果是C無限大也就是計算密集型的那么線程太多意義不大,因為需要CPU計算,起多了也沒用。
如果是IO密集型那么可以起更多的線程,因為等待時間過多。
簡單總結就是:IO密集多線程,計算密集線程=CPU核數(shù)比較合適。
歡迎關注筆者,持續(xù)分享有價值的優(yōu)質(zhì)架構文章。
java什么是線程池及為什么要使用線程池?
創(chuàng)建線程要花費昂貴的資源和時間,如果任務來了才創(chuàng)建線程那么響應時間會變長,而且一個進程能創(chuàng)建的線程數(shù)有限。為了避免這些問題,在程序啟動的時候就創(chuàng)建若干線程來響應處理,它們被稱為線程池,里面的線程叫工作線程。從JDK1.5開始,Java API提供了Executor框架讓你可以創(chuàng)建不同的線程池。比如單線程池,每次處理一個任務;數(shù)目固定的線程池或者是緩存線程池(一個適合很多生存期短的任務的程序的可擴展線程池)。