《Java8 實(shí)戰(zhàn)》P233
解釋一下:
線程池大小的設(shè)置要考慮的因素很多,單純只考慮任務(wù)特性是cpu密集型還是io密集型的情況下:cpu密集型左敌,計(jì)算比較多通常設(shè)置N*cpu核數(shù),IO密集型谨垃,數(shù)據(jù)庫(kù)操作比較較多癣诱,設(shè)置2*cpu核數(shù)匿沛。對(duì)于混合型的敦捧,《Java8 實(shí)戰(zhàn)》P233 有這樣一個(gè)公式须板,圖2公式變形之后可知,在cpu核數(shù)只有1個(gè)且要求cpu使用率100%兢卵,Nth = 1习瑰,也就是說(shuō)設(shè)置線程數(shù)為1;同理秽荤,cpu核數(shù)為1甜奄,w:c = 1 :1,cpu使用率要達(dá)到100%窃款,Nth = 2课兄,即cpu核數(shù)設(shè)置為2。在這種情況下可以用紅色箭頭方向解釋晨继,單位時(shí)間內(nèi)第喳,前半段第一個(gè)線程進(jìn)行cpu使用,后半段io的時(shí)候踱稍,第二個(gè)線程使用cpu達(dá)到cpu使用率100%曲饱。但注意,在實(shí)際中線程池線程數(shù)設(shè)置要考慮的因素很多往往并沒(méi)有按照如上公式嚴(yán)格執(zhí)行珠月。
如何合理配置線程池(多種情況考慮):
1.分析任務(wù)特性
根據(jù)任務(wù)特性任務(wù)的性質(zhì):CPU密集型任務(wù)扩淀,IO密集型任務(wù)和混合型任務(wù)。
任務(wù)的優(yōu)先級(jí):高啤挎,中和低驻谆。
任務(wù)的執(zhí)行時(shí)間:長(zhǎng),中和短庆聘。
任務(wù)的依賴性:是否依賴其他系統(tǒng)資源胜臊,如數(shù)據(jù)庫(kù)連接。
2.任務(wù)性質(zhì)不同的任務(wù)可以用不同規(guī)模的線程池分開(kāi)處理伙判。CPU密集型任務(wù)配置盡可能小的線程象对,如配置Ncpu+1個(gè)線程的線程池。IO密集型任務(wù)則由于線程并不是一直在執(zhí)行任務(wù)宴抚,則配置盡可能多的線程勒魔,如2*Ncpu」角混合型的任務(wù)冠绢,如果可以拆分,則將其拆分成一個(gè)CPU密集型任務(wù)和一個(gè)IO密集型任務(wù)常潮,只要這兩個(gè)任務(wù)執(zhí)行的時(shí)間相差不是太大弟胀,那么分解后執(zhí)行的吞吐率要高于串行執(zhí)行的吞吐率,如果這兩個(gè)任務(wù)執(zhí)行時(shí)間相差太大喊式,則沒(méi)必要進(jìn)行分解孵户。我們可以通過(guò)Runtime.getRuntime().availableProcessors()方法獲得當(dāng)前設(shè)備的CPU個(gè)數(shù)。
3.優(yōu)先級(jí)不同的任務(wù)可以使用優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue來(lái)處理垃帅。它可以讓優(yōu)先級(jí)高的任務(wù)先得到執(zhí)行延届,需要注意的是如果一直有優(yōu)先級(jí)高的任務(wù)提交到隊(duì)列里,那么優(yōu)先級(jí)低的任務(wù)可能永遠(yuǎn)不能執(zhí)行贸诚。
4.執(zhí)行時(shí)間不同的任務(wù)可以交給不同規(guī)模的線程池來(lái)處理方庭,或者也可以使用優(yōu)先級(jí)隊(duì)列,讓執(zhí)行時(shí)間短的任務(wù)先執(zhí)行酱固。
5.依賴數(shù)據(jù)庫(kù)連接池的任務(wù)械念,因?yàn)榫€程提交SQL后需要等待數(shù)據(jù)庫(kù)返回結(jié)果,如果等待的時(shí)間越長(zhǎng)CPU空閑時(shí)間就越長(zhǎng)运悲,那么線程數(shù)應(yīng)該設(shè)置越大龄减,這樣才能更好的利用CPU。
6.建議使用有界隊(duì)列班眯,有界隊(duì)列能增加系統(tǒng)的穩(wěn)定性和預(yù)警能力希停,可以根據(jù)需要設(shè)大一點(diǎn)烁巫,比如幾千。