本篇介紹一下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...