java2第九章的总结_java并发的艺术-读书笔记-第九章线程池
使用線程池的好處:
1.降低資源消耗:減少了線程創(chuàng)建和銷毀的資源消耗
2.提高響應(yīng)速度,當(dāng)任務(wù)到達(dá)時(shí),線程可以不盡興創(chuàng)建直接處理
3.提高線程的可管理性。使用線程池可以對(duì)線程進(jìn)行統(tǒng)一的管理,監(jiān)控,使用。
線程池的源碼分析:
public void execute(Runnable command){
if(command==null){
throw new NullPointerException();
}
//如果執(zhí)行線程數(shù)小于基本線程,則創(chuàng)建線程,并執(zhí)行任務(wù)
if(poolsize>=corepoolsize||!addifundercoresize(command)){
//如果線程池?cái)?shù)量大于等于核心池?cái)?shù)量或者線程創(chuàng)建失敗,直接放入隊(duì)列中
if(runstate==runnable&&workQueue.offer(command)){
if(runstate!=runnable||poolsize==0){
eusureQueueTaskHandled(command);
}
}
//如果線程池不處于運(yùn)行中或者無(wú)法放入任務(wù)隊(duì)列,并且當(dāng)前線程小于最大允許線程,則創(chuàng)建新線程
if(!addundermaxpoolsize(command)){
reject(command);
}
}
}
工作線程偽代碼如下:
public void runnable(){
Runnable task=firsttask;
firsttask=null;
while(task!=null||task=workQueue.get()!=null){
runtask(task);
task=null;
}
finally{
workDone(this);
}
}
線程池的使用
創(chuàng)建線程池:new ThreadPoolExecutor(corepoolsize,maxpoolsize,keepalivetime,millseconds,runnabletaskqueue,hander);
參數(shù)說(shuō)明
runnabletaskqueue,是一個(gè)用于存儲(chǔ)任務(wù)的阻塞隊(duì)列,通常 arryayblockingqueue linkedblockingqueue pritoryblockingqueue
hander:飽和策略:1 abortpolicy ?丟棄 ?2 discardpolicy ?不丟棄 3 callerrunspolicy 只有調(diào)用者線程來(lái)執(zhí)行,discardoldestpolicy 丟棄隊(duì)列里最近的一個(gè)任務(wù),并執(zhí)行當(dāng)前任務(wù)
keepalivetime:線程池中的工作線程空閑后,可以保持存活的有效時(shí)間
timeunit:可保持存活時(shí)間的 有效單位 天 ,小時(shí) 分,秒等
向線程池中提交任務(wù):execute 和submit
execute 用于提交無(wú)返回值的結(jié)果
submit用于提交有返回值的線程
通過(guò)submit方法提交的線程會(huì)返回一個(gè)future類型的對(duì)象,通過(guò)這個(gè)future類對(duì)象可以判斷返回值時(shí)否成功。通過(guò)future。get方法獲取返回值,get方法會(huì)阻塞當(dāng)前線程,直到任務(wù)完成,并且get方法可以設(shè)置時(shí)間來(lái)實(shí)現(xiàn)異步調(diào)用返回
關(guān)閉線程池
關(guān)閉線程池游兩種方法:shutdown shutdownNow方法關(guān)閉線程池
shutdown原理:逐個(gè)遍歷工作線程,調(diào)用工作線程的interrupt方法,所以無(wú)法中斷響應(yīng)的線程可能無(wú)法終止。
shutdownnow原理:首先將線程池設(shè)置成stop狀態(tài),然后嘗試終止所有正在執(zhí)行或暫停任務(wù)的線程,并返回等待執(zhí)行的任務(wù)列表。只要調(diào)用了兩種方法中的任意一種,則isshutdown返回true,當(dāng)所有任務(wù)已關(guān)閉,才表示線程池關(guān)閉成功則isterminaled返回true,shutdownnow方法可能任務(wù)不一定會(huì)執(zhí)行完。通常使用shutdown來(lái)關(guān)閉
合理配置線程池
cpu密集型任務(wù)應(yīng)配置盡可能小的線程。如配置cup+1個(gè)線程。由于io密集型任務(wù)并不一定是在一直執(zhí)行任務(wù)。所以應(yīng)配置盡可能多的線程,如配置2*cup個(gè)線程。如果是混合型的任務(wù)則可以拆分。拆分成一個(gè)cup密集型的任務(wù)和一個(gè)io密集型的任務(wù),如果這兩個(gè)任務(wù)執(zhí)行時(shí)間相差不大則吞吐量高于單線程任務(wù),如果相差太大則沒(méi)必要進(jìn)行分解。
Runtime.getRuntime.getAvaliableProcessors 獲得cup數(shù)量
優(yōu)先級(jí)不同的任務(wù)可使用優(yōu)先級(jí)隊(duì)列pritorityblockqueue來(lái)處理
建議使用有界隊(duì)列,因?yàn)槌霈F(xiàn)異常任務(wù)積壓時(shí)可以執(zhí)行拒絕策略,及時(shí)預(yù)警
線程池的監(jiān)控
taskcount :線程池中需要執(zhí)行的任務(wù)數(shù)量
completaskcount:線程池已經(jīng)完成的線程數(shù)量
largestpoolsize:線程池中曾經(jīng)創(chuàng)建過(guò)的最大的線程數(shù)量
poolsize 線程池中的線程數(shù)量
getactivecount:線程池中活動(dòng)的線程樹
可以通過(guò)繼承線程你來(lái)自定義線程池的 beforeExecute afterExecute terminated 方法來(lái)對(duì)線程池進(jìn)行監(jiān)控
總結(jié)
以上是生活随笔為你收集整理的java2第九章的总结_java并发的艺术-读书笔记-第九章线程池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 过敏性鼻炎可以带角膜塑形镜吗
- 下一篇: 根尖周炎为什么脸会肿