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