執行緒池簡介

2021-06-29 00:19:53 字數 1736 閱讀 8750

本文**:這裡

什麼是執行緒池?

諸如web伺服器、資料庫伺服器、檔案伺服器和郵件伺服器等許多伺服器應用都面向處理來自某些遠端**的大量短小的任務。構建伺服器應用程式的乙個過於簡單的模型是:每當乙個請求到達就建立乙個新的服務物件,然後在新的服務物件中為請求服務。但當有大量請求併發訪問時,伺服器不斷的建立和銷毀物件的開銷很大。所以提高伺服器效率的乙個手段就是盡可能減少建立和銷毀物件的次數,特別是一些很耗資源的物件建立和銷毀,這樣就引入了「池」的概念,「池」的概念使得人們可以定製一定量的資源,然後對這些資源進行復用,而不是頻繁的建立和銷毀。

執行緒池是預先建立執行緒的一種技術。執行緒池在還沒有任務到來之前,建立一定數量的執行緒,放入空閒佇列中。這些執行緒都是處於睡眠狀態,即均為啟動,不消耗cpu,而只是占用較小的記憶體空間。當請求到來之後,緩衝池給這次請求分配乙個空閒執行緒,把請求傳入此執行緒中執行,進行處理。當預先建立的執行緒都處於執行狀態,即預製執行緒不夠,執行緒池可以自由建立一定數量的新執行緒,用於處理更多的請求。當系統比較閒的時候,也可以通過移除一部分一直處於停用狀態的執行緒。

執行緒池的注意事項

雖然執行緒池是構建多執行緒應用程式的強大機制,但使用它並不是沒有風險的。在使用執行緒池時需注意執行緒池大小與效能的關係,注意併發風險、死鎖、資源不足和執行緒洩漏等問題。

(1)執行緒池大小。多執行緒應用並非執行緒越多越好,需要根據系統執行的軟硬體環境以及應用本身的特點決定執行緒池的大小。一般來說,如果**結構合理的話,執行緒數目與cpu 數量相適合即可。如果執行緒執行時可能出現阻塞現象,可相應增加池的大小;如有必要可採用自適應演算法來動態調整執行緒池的大小,以提高cpu 的有效利用率和系統的整體效能。

(2)併發錯誤。多執行緒應用要特別注意併發錯誤,要從邏輯上保證程式的正確性,注意避免死鎖現象的發生。

(3)執行緒洩漏。這是執行緒池應用中乙個嚴重的問題,當任務執行完畢而執行緒沒能返回池中就會發生執行緒洩漏現象。

簡單執行緒池的設計

乙個典型的執行緒池,應該包括如下幾個部分:

1、執行緒池管理器(threadpool),用於啟動、停用,管理執行緒池

2、工作執行緒(workthread),執行緒池中的執行緒

3、請求介面(workrequest),建立請求物件,以供工作執行緒排程任務的執行

4、請求佇列(requestqueue),用於存放和提取請求

5、結果佇列(resultqueue),用於儲存請求執行後返回的結果

執行緒池管理器,通過新增請求的方法(putrequest)向請求佇列(requestqueue)新增請求,這些請求事先需要實現請求介面,即傳遞工作函式、引數、結果處理函式、以及異常處理函式。之後初始化一定數量的工作執行緒,這些執行緒通過輪詢的方式不斷檢視請求佇列(requestqueue),只要有請求存在,則會提取出請求,進行執行。然後,執行緒池管理器呼叫方法(poll)檢視結果佇列(resultqueue)是否有值,如果有值,則取出,呼叫結果處理函式執行。通過以上講述,不難發現,這個系統的核心資源在於請求佇列和結果佇列,工作執行緒通過輪詢requestqueue獲得人物,主線程通過檢視結果佇列,獲得執行結果。因此,對這個佇列的設計,要實現執行緒同步,以及一定阻塞和超時機制的設計,以防止因為不斷輪詢而導致的過多cpu開銷。在本文中,將會用python語言實現,python的queue,就是很好的實現了對執行緒同步機制。

java 執行緒池簡介

newfixedthreadpool int nthreads 初始化乙個指定執行緒數的執行緒池,其中核心執行緒數和最大執行緒數都為nthreads,使用linkedblockingquene作為阻塞佇列。newcachedthreadpool 初始化乙個可以快取執行緒的執行緒池,預設快取60s,核...

執行緒池系列 一 執行緒池簡介

執行緒池主要解決了倆個問題 一是避免了頻繁建立銷毀執行緒所帶來的開銷,達到了執行緒復用的目的 二是執行緒池提供了一種資源限制和管理的手段,使用者可以通過一些引數來定製化執行緒 public class threadpoolexecutor extends abstractexecutorservic...

執行緒池的簡介及執行緒池封裝

執行緒池 執行緒池就是首先建立一些執行緒,它們的集合稱為執行緒池。使用執行緒池可以很好地提高效能,執行緒池在系統啟動時即建立大量空閒的執行緒,程式將乙個任務傳給執行緒池,執行緒池就會啟動一條執行緒來執行這個任務,執行結束以後,該執行緒並不會死亡,而是再次返回執行緒池中成為空閒狀態,等待執行下乙個任務...