Java線程池
三大好處:
1.降低資源消耗带欢;2.提高響應(yīng)速度荒辕;3.提高線程的可管理性兼搏;
ThreadPoolExecutor:
new ThreadPoolExecutor (
corePoolSize,? ? ? ? //線程池基本大小
maximumPoolSize,? ? ?//線程池最大大小
keepAliveTime,? ? ? ? //線程活動保持時間
timeUnit,? ? ? ? //時間單位
runnableTaskQueue,? ?//任務(wù)隊列症虑,可選ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,PriorityBlockingQueue。建議使用有界隊列勇皇,增加系統(tǒng)穩(wěn)定性和預(yù)警能力罩句。無界隊列可能引起內(nèi)存撐爆,影響其他應(yīng)用敛摘。
threadFactory,? ?//創(chuàng)建線程的工廠
?handler);? ? ? //飽和策略门烂,有:CallerRunsPolicy,DiscardOldestPolicy,DiscardPolicy,或者自定義實現(xiàn)。
向線程池提交任務(wù):
1.execute(),輸入一個Runnable兄淫,無返回值屯远;
2.submit(),返回一個Future,通過future的get方法阻塞直到任務(wù)完成捕虽;
合理配置線程池:
1.根據(jù)任務(wù)性質(zhì):
? ? ? ? ? ?CPU密集型:配置盡可能少的線程數(shù)慨丐,一般Ncpu+1個;
? ? ? ? ? ?IO密集型:盡可能多配置線程數(shù)泄私,如2*Ncpu個房揭;
? ? ? ? ? ?混合型:能拆分盡量拆分挨措。
(ps:通過Runtime.getRuntime().availableProcessors()方法獲得當(dāng)前設(shè)備的CPU數(shù))
2.根據(jù)任務(wù)優(yōu)先級:? 可以用PriorityBlockingQueue來處理。
3.根據(jù)任務(wù)執(zhí)行時間:? 交給不同規(guī)模線程池處理崩溪,或者采用優(yōu)先級隊列。
4.其他資源(如數(shù)據(jù)庫)的依賴性:如提交sql后等待數(shù)據(jù)庫返回結(jié)果時間較長斩松,則可以設(shè)置較大的線程數(shù)伶唯;
線程池的監(jiān)控
幾個常用參數(shù):
taskCount? ? 需要執(zhí)行任務(wù)數(shù);
completedTaskCount? ? 已完成任務(wù)數(shù)惧盹;
largestPoolSize? ? ?曾經(jīng)創(chuàng)建過的最大線程數(shù)乳幸;
getPoolSize? ? ? 線程池中線程數(shù)量;
getActiveCount? ? 獲取活動的線程數(shù)钧椰;
參考資料:
1. 《Java線程池的分析和使用》? 并發(fā)編程網(wǎng) http://ifeve.com/java-threadpool/