執行緒池及適用場合

2021-08-06 06:17:56 字數 1523 閱讀 7548

1

、為什麼需要執行緒池?

目前的大多數網路伺服器,包括web伺服器、email伺服器以及資料庫伺服器等都具有乙個共同點,就是單位時間內必須處理數目巨大的連線請求,但處理時間卻相對較短。

傳統多執行緒方案中我們採用的伺服器模型則是一旦接受到請求之後,即建立乙個新的執行緒,由該執行緒執行任務。任務執行完畢後,執行緒退出,這就是是「即時建立,即時銷毀」的策略。儘管與建立程序相比,建立執行緒的時間已經大大的縮短,但是如果提交給執行緒的任務是執行時間較短,而且執行次數極其頻繁,那麼伺服器將處於不停的建立執行緒,銷毀執行緒的狀態。

我們將傳統方案中的執行緒執行過程分為三個過程:t1、t2、t3。

t1:執行緒建立時間

t2:執行緒執行時間,包括執行緒的同步等時間

t3:執行緒銷毀時間

那麼我們可以看出,執行緒本身的開銷所佔的比例為(t1+t3) / (t1+t2+t3)。如果執行緒執行的時間很短的話,這比開銷可能佔到20%-50%左右。如果任務執行時間很頻繁的話,這筆開銷將是不可忽略的。

除此之外,執行緒池能夠減少建立的執行緒個數。通常執行緒池所允許的併發執行緒是有上界的,如果同時需要併發的執行緒數超過上界,那麼一部分執行緒將會等待。而傳統方案中,如果同時請求數目為2000,那麼最壞情況下,系統可能需要產生2000個執行緒。儘管這不是乙個很大的數目,但是也有部分機器可能達不到這種要求。

因此執行緒池的出現正是著眼於減少執行緒池本身帶來的開銷。執行緒池採用預建立的技術,在應用程式啟動之後,將立即建立一定數量的執行緒(n1),放入空閒佇列中。這些執行緒都是處於阻塞(suspended)狀態,不消耗cpu,但占用較小的記憶體空間。當任務到來後,緩衝池選擇乙個空閒執行緒,把任務傳入此執行緒中執行。當n1個執行緒都在處理任務後,緩衝池自動建立一定數量的新執行緒,用於處理更多的任務。在任務執行完畢後執行緒也不退出,而是繼續保持在池中等待下一次的任務。當系統比較空閒時,大部分執行緒都一直處於暫停狀態,執行緒池自動銷毀一部分執行緒,**系統資源。

基於這種預建立技術,執行緒池將執行緒建立和銷毀本身所帶來的開銷分攤到了各個具體的任務上,執行次數越多,每個任務所分擔到的執行緒本身開銷則越小,不過我們另外可能需要考慮進去執行緒之間同步所帶來的開銷。

2、執行緒池適合場合

事實上,執行緒池並不是萬能的。它有其特定的使用場合。執行緒池致力於減少執行緒本身的開銷對應用所產生的影響,這是有前提的,前提就是執行緒本身開銷與執行緒執行任務相比不可忽略。如果執行緒本身的開銷相對於執行緒任務執行開銷而言是可以忽略不計的,那麼此時執行緒池所帶來的好處是不明顯的,比如對於ftp伺服器以及telnet伺服器,通常傳送檔案的時間較長,開銷較大,那麼此時,我們採用執行緒池未必是理想的方法,我們可以選擇「即時建立,即時銷毀」的策略。

總之執行緒池通常適合下面的幾個場合:

(1)  單位時間內處理任務頻繁而且任務處理時間短

(2)  對實時性要求較高。如果接受到任務後在建立執行緒,可能滿足不了實時要求,因此必須採用執行緒池進行預建立。

(3)  必須經常面對高突發性事件,比如

web伺服器,如果有足球轉播,則伺服器將產生巨大的衝擊。此時如果採取傳統方法,則必須不停的大量產生執行緒,銷毀執行緒。此時採用動態執行緒池可以避免這種情況的發生

常用執行緒池及適用場景

arrayblockingqueue 有界佇列 是乙個陣列實現的有界阻塞佇列,按fifo排序量 linkedblockingqueue 是乙個基於鍊錶實現的阻塞佇列,按fifo排序任務,可以設定容量,不設定使用integer.max value 不設定就是無界佇列 newfixthreadpool,...

IO多路復用適用場合

io多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備讀取,它就通知該程序。io多路復用適用如下場合 1 當客戶處理多個描述字時 一般是互動式輸入和網路套介面 必須使用i o復用。2 當乙個客戶同時處理多個套介面時,而這種情況是可能的,但很少出現。3 如果乙個tcp伺服器既要處理監聽套介面,...

常用資料結構的適用場合

常用資料結構的適用場合 如果訪問元素的操作的效率十分重要,可以使用 array dynamic array hash table 如果插入 刪除操作的效率十分重要,可以使用linked list和hash table 如果查詢元素的操作效率十分重要,首選hash table,其次為red black...