public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) {
......
}
有兩個重要的參數(shù)設(shè)置:核心線程數(shù)corePoolSize遮糖,最大線程數(shù)maximumPoolSize绣的。
線程和哪些因素有關(guān)?
CPU
在最開始介紹多線程《多線程的由淺及深》時欲账,介紹到線程共享進程的上下文環(huán)境屡江,為更細粒度的CPU時間段。所以線程數(shù)的確定和CPU有關(guān)赛不。至于CPU的核數(shù)和線程數(shù)的關(guān)系惩嘉,可以查看這篇文章:CPU的核心數(shù)、線程數(shù)的關(guān)系和區(qū)別踢故。(多線程實際上是計算機多種資源的并行運用文黎,跟CPU有幾個核心是沒什么關(guān)系的)IO
IO分為磁盤IO和網(wǎng)絡(luò)IO。影響磁盤的關(guān)鍵因數(shù)是磁盤服務(wù)時間殿较,即磁盤完成一個I/O請求所花費的時間耸峭,它由尋道時間、旋轉(zhuǎn)延遲和數(shù)據(jù)傳輸時間三部分構(gòu)成淋纲。衡量其關(guān)鍵指標劳闹,大致是IOPS、吞吐量等洽瞬。影響網(wǎng)絡(luò)IO的關(guān)鍵因素是服務(wù)器響應(yīng)延時 + 帶寬限制 + 網(wǎng)絡(luò)延時 + 跳轉(zhuǎn)路由延時 + 本地接收延時玷或。并行
多個cpu實例或者多臺機器同時執(zhí)行一段處理邏輯并發(fā)
CPU不斷切換線程來實現(xiàn)多路復(fù)用,以提升效率片任。通過cpu調(diào)度算法偏友,看上去同時執(zhí)行,實際上從cpu操作層面不是真正的同時对供。通常會用TPS或者QPS位他。
任務(wù)的性質(zhì)
-
CPU密集型任務(wù)
要進行大量的計算氛濒,消耗CPU資源,比如計算圓周率鹅髓、對視頻進行高清解碼等等舞竿,全靠CPU的運算能力。要最高效地利用CPU窿冯,計算密集型任務(wù)同時進行的數(shù)量應(yīng)當(dāng)?shù)扔贑PU的核心數(shù)骗奖。一般配置線程數(shù)=CPU總核心數(shù)+1 (+1是為了利用等待空閑)
-
IO密集型任務(wù)
這類任務(wù)的CPU消耗很少,任務(wù)的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內(nèi)存的速度)醒串。常見的大部分任務(wù)都是IO密集型任務(wù)执桌,比如Web應(yīng)用。對于IO密集型任務(wù)芜赌,任務(wù)越多仰挣,CPU效率越高(但也有限度)。一般配置線程數(shù)=CPU總核心數(shù) * 2 +1
總結(jié)
根據(jù)并發(fā)編程網(wǎng)的《如何合理地估算線程池大小》一文中的提示缠沈,
最佳線程數(shù)目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數(shù)目
所以線程等待時間所占比例越高膘壶,需要越多線程。線程CPU時間所占比例越高洲愤,需要越少線程
問題
-
是否使用線程池就一定比單線程效率高呢颓芭?
否。比如Redis(點擊查看)柬赐。
-
并發(fā)編程網(wǎng)的一個問題:
2.1 高并發(fā)亡问、任務(wù)執(zhí)行時間短的業(yè)務(wù)怎樣使用線程池?
線程池線程數(shù)可以設(shè)置為CPU核數(shù)+1躺率,減少線程上下文的切換
2.2 并發(fā)不高玛界、任務(wù)執(zhí)行時間長的業(yè)務(wù)怎樣使用線程池?
a)假如是業(yè)務(wù)時間長集中在IO操作上悼吱,也就是IO密集型的任務(wù)慎框,因為IO操作并不占用CPU,所以不要讓所有的CPU閑下來后添,可以適當(dāng)加大線程池中的線程數(shù)目笨枯,讓CPU處理更多的業(yè)務(wù) b)假如是業(yè)務(wù)時間長集中在計算操作上,也就是計算密集型任務(wù)遇西,線程池中的線程數(shù)設(shè)置得少一些馅精,減少線程上下文的切換
2.3 并發(fā)高、業(yè)務(wù)執(zhí)行時間長的業(yè)務(wù)怎樣使用線程池粱檀?
并發(fā)高洲敢、業(yè)務(wù)執(zhí)行時間長,解決這種類型任務(wù)的關(guān)鍵不在于線程池而在于整體架構(gòu)的設(shè)計茄蚯,看看這些業(yè)務(wù)里面某些數(shù)據(jù)是否能做緩存是第一步压彭,增加服務(wù)器是第二步睦优,以及線程池的設(shè)置。最后壮不,業(yè)務(wù)執(zhí)行時間長的問題汗盘,也可能需要分析一下,看看能不能使用中間件對任務(wù)進行拆分和解耦询一。