日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java2第九章的总结_java并发的艺术-读书笔记-第九章线程池

發布時間:2024/9/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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并发的艺术-读书笔记-第九章线程池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。