執行緒池使用總結
excutors工廠類
為了更好的控制更多的多執行緒,jdk提供返回乙個固定數量的執行緒池。
方法:自定義執行緒池-threadpoolexecutors
執行緒池相關引數的配置
threadpoolexecutor(int corepoolsize, //核心執行緒數,執行緒初始化就會被建立
int maximumpoolsize, //執行緒池最大執行緒數,無界佇列時,不起作用
long keepalivetime, //執行緒的存活時間
timeunit unit, //時間的單位
blockingqueueworkqueue, //阻塞佇列,使用無界佇列時,拒絕策略無用
threadfactory threadfactory,//theadfactory 執行緒工廠,用於獲取乙個新的執行緒,然後把該執行緒投遞到執行緒池裡面去
rejectedexecutionhandler handler) //拒絕策略
1.當設定為有界佇列時:
a 若有新的任務需要執行,如果執行緒實際數小於corethread,則先建立執行緒
b.若大於coresize,則會加入任務佇列
c.若佇列已滿,則在不大於maxinumpoolsize的情況下建立新的執行緒
d.若執行緒數不大於maxinumpoolsize會執行拒絕策略
2.當為無界佇列時
a.maximumpoolsize不起作用,也沒有拒絕策略
b.若有新的任務需要執行,如果執行緒實際數小於corethread,則先建立執行緒
c.若大於coresize,則會加入任務佇列,同時建立新的執行緒。
如何使用好執行緒池?
執行緒池數量的設定
計算機密集型
應用需要非常多的cpu計算資源,避免過多的執行緒上下文切換
執行緒數 = cpu核數+1,已可以設定為cpu核數*2,還要看jdk的版本以及cpu配置(伺服器的cpu有超執行緒)
io密集型
web應用,涉及到大量的網路傳輸,不僅如此,與資料庫,與快取間的互動也涉及到io,一旦發生io,執行緒就會處於等待狀態,當io結束後,資料準備好後,執行緒才會繼續執行。對於io密集型的應用,我們可以多設定執行緒池中線程的數量,這樣就能讓等待io的這段時間內,執行緒可以去做其它事,提高併發處理效率。執行緒上下文切換數有代價的
執行緒數 = cpu核數/(1-阻塞係數) 這個阻塞係數一般為0.8~0.9之間。
套用公司:對於雙核cpu來說,比較理想的執行緒數就是20,當然這不是絕對的,需要根據實際情況以及實際業務來調整:final int poolsize = (int)(copcore/(1-0.9))
執行緒池相關引數如何配置?
第一 我們不要去使用沒有上限的執行緒池和設定無界佇列!
比如,newcachedthreadpool的設定與無界佇列因為某些不可預期的情況,執行緒池會出現系統異常,導致執行緒暴增的情況或者任務佇列或者任務佇列不斷膨脹,記憶體耗盡導致系統崩潰。我們建議自定義執行緒池來避免改問題,這是在使用執行緒池的首要選擇。小心無大錯,千萬別過度自信。
第二 合理設定執行緒數量、和執行緒空閒**時間,根據具體的任務執行週期和時間去設定,避免頻繁的**和建立,雖然我們使用執行緒池的目的是為了提公升系統效能和吞吐量,但是也要考慮下系統的穩定性,不然出現不可預期問題會很麻!
第三,根據實際場景,選擇適用於自己的拒絕策略。進行補償,不要亂用jdk支援的自動補償機制~盡量採用自定義的拒絕策略去進行兜底!
利用hook去嵌入你的行為
關閉執行緒池
執行緒池總結
執行緒池基本思想 是一種物件池的思想,開闢一塊記憶體空間,裡面存放了眾多 未死亡 的執行緒,池中線程執行排程 由池管理器來處理。當有執行緒任務時,從池中取一根,執行完後執行緒物件歸池,這樣可以避免反覆建立執行緒物件鎖帶來的效能開銷,節約系統資源。1 動態建立執行緒池 2 建立固定大小的執行緒池 3 ...
執行緒池總結
參考部落格 threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueueworkqueue,rejectedexecutionhandler handler...
執行緒池總結
執行緒池 1.分類 規定執行緒 newfixedthreadpool 4 規定了執行緒的個數 單執行緒 newsinglethreadexecutor 和 new 的執行緒不同,當單執行緒遇到異常後,會建立新執行緒,並繼續執行,但 new 的執行緒就不會 快取執行緒 newcachedthreadp...