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