執行緒池如何管理執行緒

2021-10-05 05:32:06 字數 840 閱讀 6797

本篇介紹一下clr中,執行緒池是如何管理執行緒的。在介紹之前,先說明下執行緒池的設定。

一般不建議設定執行緒數,就像從來都不會限制程式使用的記憶體量,或限制使用的網路頻寬。

1:預設擁有的執行緒數大約是1000個執行緒。

2:32位程序最多能夠有大約1360個執行緒。

3:64位程序理論上可以建立千百萬個執行緒。

我們先了解下全域性對列和本地對列的區別:

1:全域性對列:

工作者執行緒採用先入先出的演算法從對列取出工作項,並處理他們。

所有工作者都競爭乙個同步鎖,以保證多個執行緒不會獲取同乙個工作項。

queueuserworkitem方法和timer總是將工作項放入全域性對列。

非工作者執行緒排程乙個task時,該task被新增到全域性對列。

2:本地對列:

工作者執行緒採用**先出的演算法從對列取出工作項,並處理他們。

不需要同步鎖,因此在對列新增和刪除task的速度比較快。

3:clr執行緒池的結構圖:

4:重點來了,工作者執行緒的工作流程,如下圖所示:

工作者執行緒先從本地對列獲取工作項,如果獲取到則處理,如果獲取不到,則到其他工作者執行緒的本地對列「偷」工作項,如果獲取到則處理,如果獲取不到,則到全域性對列獲取工作項,如果獲取到則處理,如果獲取不到則進入睡眠,如果睡眠時間長,它會自己想來,並銷毀自身。

如上就是我對工作者執行緒工作原理的理解,**不對,還請指教。

執行緒池 執行緒管理

執行緒池中的執行緒由兩類組成 工作者執行緒和i o執行緒。threadpool.queueuserworkitem和timer類總是將工作項 即執行緒要 的委託 放到全域性佇列中。工作者執行緒採用乙個fifo演算法將工作項從這個佇列中取出,並處理它們。由於多個工作者執行緒可能同時從全域性佇列中拿走工...

執行緒池 如何正確的關閉執行緒池

在呼叫這個關閉方法時,執行緒池會根據我們配置的拒絕策略來拒絕掉想要進來的執行緒,也就是說吧建立執行執行緒的入口給關閉掉了,直到執行緒池內的所有執行緒都執行完成。在呼叫這個方法完畢之後,並不代表這個執行緒池就真的都停掉了,只能說他不讓其他執行緒進來了,然後等到執行緒池內的執行緒執行完。shutdown...

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...