執行緒池 執行緒管理

2022-02-12 13:02:39 字數 772 閱讀 5527

執行緒池中的執行緒由兩類組成:工作者執行緒和i/o執行緒。

threadpool.queueuserworkitem和timer類總是將工作項(即執行緒要**的委託)放到全域性佇列中。工作者執行緒採用乙個fifo演算法將工作項從這個佇列中取出,並處理它們。由於多個工作者執行緒可能同時從全域性佇列中拿走工作項,所以所有的工作者執行緒都競爭乙個執行緒同步鎖,以保證兩個或者多個執行緒不會獲取同乙個工作項。

對於預設的taskscheduler排程task物件時,如果是乙個非工作者執行緒呼叫乙個task,那麼task會新增到全域性佇列中。但是,每個工作者執行緒都有它自己的本地佇列。當乙個工作者執行緒排程乙個task時,task會新增到呼叫執行緒的本地佇列。

乙個工作者執行緒準備好處理乙個工作項時,它總是先檢查它本地佇列來查詢乙個task。如果存在乙個task,工作者執行緒就從它本地佇列中移除task,並對工作項進行處理。工作者執行緒採用lifo演算法將任務從它的本地佇列中取出。由於工作者執行緒是唯一允許訪問它自己的本地佇列頭的執行緒,所以無需同步鎖。

如果乙個工作者執行緒發現它的本地佇列空了,工作者執行緒會嘗試從另乙個工作者執行緒的本地佇列中取乙個task。這個task是從乙個本地佇列的尾部取走的,並要求獲取乙個執行緒同步鎖,如果本地佇列都變空,那麼工作者執行緒會使用fifo從全域性佇列中獲取乙個工作項。如果全域性佇列也為空,那麼工作者執行緒把自己置入睡眠狀態,等待事情的發生。如果睡眠時間太長了,它會自己醒來,並自身銷毀,允許系統**執行緒使用的資源(包括核心物件、棧、teb等)。

執行緒池如何管理執行緒

本篇介紹一下clr中,執行緒池是如何管理執行緒的。在介紹之前,先說明下執行緒池的設定。一般不建議設定執行緒數,就像從來都不會限制程式使用的記憶體量,或限制使用的網路頻寬。1 預設擁有的執行緒數大約是1000個執行緒。2 32位程序最多能夠有大約1360個執行緒。3 64位程序理論上可以建立千百萬個執...

ExecutorService執行緒池管理

1 public class inter 13 14 es.execute new runnable 21 22 2324 25 根據任務量啟動執行緒數量 26 27public void allthread catch interruptedexception e 45 46 47 48 49 5...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...