接上文 下面是這三個(gè)靜態(tài)方法的具體實(shí)現(xiàn);
從它們的具體實(shí)現(xiàn)來(lái)看,它們實(shí)際上也是調(diào)用了ThreadPoolExecutor,只不過(guò)參數(shù)都已配置好了。 newFixedThreadPool創(chuàng)建的線程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue; newSingleThreadExecutor將corePoolSize和maximumPoolSize都設(shè)置為1,也使用的LinkedBlockingQueue; newCachedThreadPool將corePoolSize設(shè)置為0,將maximumPoolSize設(shè)置為Integer.MAX_VALUE,使用的SynchronousQueue,也就是說(shuō)來(lái)了任務(wù)就創(chuàng)建線程運(yùn)行,當(dāng)線程空閑超過(guò)60秒,就銷(xiāo)毀線程。 實(shí)際中,如果Executors提供的三個(gè)靜態(tài)方法能滿(mǎn)足要求,就盡量使用它提供的三個(gè)方法,因?yàn)樽约喝ナ謩?dòng)配置ThreadPoolExecutor的參數(shù)有點(diǎn)麻煩,要根據(jù)實(shí)際任務(wù)的類(lèi)型和數(shù)量來(lái)進(jìn)行配置。 另外,如果ThreadPoolExecutor達(dá)不到要求,可以自己繼承ThreadPoolExecutor類(lèi)進(jìn)行重寫(xiě)。 四.如何合理配置線程池的大小本節(jié)來(lái)討論一個(gè)比較重要的話(huà)題:如何合理配置線程池大小,僅供參考。 一般需要根據(jù)任務(wù)的類(lèi)型來(lái)配置線程池大?。?/p> 如果是CPU密集型任務(wù),就需要盡量壓榨CPU,參考值可以設(shè)為 NCPU+1 如果是IO密集型任務(wù),參考值可以設(shè)置為2*NCPU 當(dāng)然,這只是一個(gè)參考值,具體的設(shè)置還需要根據(jù)實(shí)際情況進(jìn)行調(diào)整,比如可以先將線程池大小設(shè)置為參考值,再觀察任務(wù)運(yùn)行情況和系統(tǒng)負(fù)載、資源利用率來(lái)進(jìn)行適當(dāng)調(diào)整。 參考資料: http:///java-threadpool/ http://blog.163.com/among_1985/blog/static/275005232012618849266/ http://developer.51cto.com/art/201203/321885.htm http://blog.csdn.net/java2000_wl/article/details/22097059 http://blog.csdn.net/cutesource/article/details/6061229 http://blog.csdn.net/xieyuooo/article/details/8718741 《JDK API 1.6》 |
|