先瞭解一個概念,CLR,以前認為CLR就只是一個軟體運行的環境,今天發現其實並不是這樣。每個.net程式都運行在一個完全獨立的CLR實例上,每個CLR都有一個線程池,當然一個進程也可以載入多個CLR。 為什麼要使用線程池,即比起直接新建線程的優勢在哪裡? 線程池其實就是一個存放線程對象的“池子(po ...
先瞭解一個概念,CLR,以前認為CLR就只是一個軟體運行的環境,今天發現其實並不是這樣。每個.net程式都運行在一個完全獨立的CLR實例上,每個CLR都有一個線程池,當然一個進程也可以載入多個CLR。
為什麼要使用線程池,即比起直接新建線程的優勢在哪裡?
線程池其實就是一個存放線程對象的“池子(pool)”,他提供了一些基本方法,如:設置pool中最小/最大線程數量、把要執行的方法排入隊列等等。ThreadPool是一個靜態類,因此可以直接使用,不用創建對象。
每新建一個線程都需要占用記憶體空間和其他資源,而新建了那麼多線程,有很多在休眠,或者在等待資源釋放;又有許多線程只是周期性的做一些小工作,如刷新數據等等,太浪費了,划不來,實際編程中大量線程突發,然後在短時間內結束的情況很少見。於是,就提出了線程池的概念。線程池中的線程執行完指定的方法後並不會自動消除,而是以掛起狀態返回線程池,如果應用程式再次向線程池發出請求,那麼處以掛起狀態的線程就會被激活並執行任務,而不會創建新線程,這就節約了很多開銷。只有當線程數達到最大線程數量,系統才會自動銷毀線程。因此,使用線程池可以避免大量的創建和銷毀的開支,具有更好的性能和穩定性,其次,開發人員把線程交給系統管理,可以集中精力處理其他任務。
什麼時候使用線程池?
1.單個任務處理的時間比較短
2.需要處理的任務的數量大
線程池最多管理的線程數?
線程池最多管理線程數量=“處理器數 * 250”。也就是說,如果您的機器為2個2核CPU,那麼CLR線程池的容量預設上限便是1000
通過線程池創建的線程預設為後臺線程,優先順序預設為Normal。
下麵列出在網上找到的兩個例子:
例1:使用線程池的基本方法
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(ThreadMethod1,new object());
Console.ReadKey();
}
public static void ThreadMethod1(object val)
{
for (int i = 0; i <= 500000000; i++)
{
if (i % 1000000 == 0)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
}
}
}
例2:使用線程池的優勢
線程池中最多5個線程,執行一個方法60次,算5年總工資,如下:
如果不採用線程池,恐怕要開60線程非同步執行Run()方法,空間資源之浪費,可見一斑。而現在我們最多用了5個線程。