面試系列 談談執行緒池的使用

2022-09-07 17:24:20 字數 2390 閱讀 3906

他的主要特點就是:執行緒復用,管理執行緒,控制最大併發數。

使用執行緒池的好處:

第一:降低資源消耗,通過重複利用自己建立的執行緒降低執行緒建立和銷毀造成的消耗。

第二::提高響應速度.當任務到達時,任務可以不需要等到執行緒和粗昂就愛你就能立即執行.

第三:提高執行緒的可管理性.執行緒是稀缺資源,如果無限的創阿金,不僅會消耗資源,還會較低系統的穩定性,使用執行緒池可以進行統一分配,調優和監控.

j**a中的執行緒池是通過executor框架實現的,該框架中用到了executor,executors,executorservice,threadpoolexecutor這幾個類。

執行緒池有幾個常見的實現方法executors.newfixedthreadpool(5)、executors.newsinglethreadexecutor()、executors.newcachedthreadpool();

下面是執行緒池幾個實現類的基本使用:

public

class

mythreadpooldemo);

}}catch

(exception e)

finally

}}

觀察這幾個實現方法的底層原始碼發現,其實都是new了同乙個物件即為threadpoolexecutor。

這裡我們仔細的研究一下這個類threadpoolexecutor。

下面是threadpoolexecutor構造方法的原始碼

構造方法有七個引數,其中:

1.當建立執行緒池後,等待提交過來的任務。

2.當呼叫execute()方法新增乙個任務請求時,執行緒池會做出如下判斷:

3.當執行緒完成任務時,他會從佇列中取下乙個任務執行。

4.當乙個執行緒無事可做超過一定時間(keepalivetime)時,執行緒池會判斷,如果當前執行執行緒數大於corepoolsize,那麼這個執行緒就是被停掉。

這裡會有當等待佇列中的任務已經排滿了,再也塞不進新任務,同時執行緒池中的執行緒也達到了最大值的時候,無法繼續為新任務服務時,就會採取拒絕策略。

jdk內建的拒絕策略有:

在使用執行緒建立的時候要注意以下的方面:

執行緒資源必須通過執行緒池提供,不允許在應用中自行顯式建立執行緒。 說明:使用執行緒池的好處是減少在建立和銷毀執行緒上所消耗的時間以及系統資源的開銷,解決資源不足的問題。如果不使用執行緒池,有可能造成系統建立大量同類執行緒而導致消耗完記憶體或者「過度切換」的問題。

執行緒池不允許使用executors去建立,而是通過threadpoolexecutor的方式,這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。說明:executors返回的執行緒池物件的弊端如下:

1)fixedthreadpool和singlethreadpool:允許的請求佇列長度為integer.max_value,可能會堆積大量的請求,從而導致oom。

2)cachedthreadpool和scheduledthreadpool:允許的建立執行緒數量為integer.max_value,可能會建立大量的執行緒,從而導致oom。

-----參考阿里巴巴j**a開發手冊

public

class

mythreadpooldemo);

}}catch

(exception e)

finally

}}

這裡面會有乙個問題,在建立執行緒池的時候,最大執行緒數該如何設定呢?這個還是要具體情況具體分析

當系統執行的是cpu密集型的,也就是該任務需要大量的運算,而沒有阻塞,cpu一直執行。這時候盡可能少的開啟執行緒數量。執行緒池中的數量最好為,cpu核數+1

當系統執行的是io密集型,也就是任務需要大量io,大量的阻塞。可以採用多開執行緒的方式為cpu核數*2.還有一種方式就是cpu核數/1-阻塞系統,通常阻塞系統在0.8到0.9之間。

盡可能少的開啟執行緒數量。執行緒池中的數量最好為,cpu核數+1

當系統執行的是io密集型,也就是任務需要大量io,大量的阻塞。可以採用多開執行緒的方式為cpu核數*2.還有一種方式就是cpu核數/1-阻塞系統,通常阻塞系統在0.8到0.9之間。

Android面試 談談執行緒池的原理

執行緒池有什麼好處,我們怎麼更好的使用它 回答問題三步走 執行緒池是用來幹嘛的?執行緒池是怎麼實現的,核心原理 執行緒池有什麼好處,我們怎麼更好的使用它 如果併發的執行緒數量很多,並且每個執行緒都是執行乙個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷毀執行...

C 乾貨系列 談談在變數中使用auto

用作變數型別推演的關鍵字auto可能是c 11最著名的特性了,所以這篇文章我長話短說,簡單寫一下我認為比較重要的使用法則。我們都是用auto這個關鍵字來代替乙個具體變數的型別定義,讓編譯器自己去尋找和從它的初始化過程中來推演這個變數的型別。最著名的關於auto的用法恐怕莫過於用它來躲開一堆長長的型別...

執行緒池的使用

簡而言之 兩個類 執行緒池的 類 public class threadpoolproxyfactory return mnormalthreadpoolproxy return public static threadpoolproxy createdownloadthreadpoolproxy ...