如果設計一個服務器程序,每當處理用戶請求時,都開始一個線程,將會在一 定程序上消耗服務器的資源。為此,一個最好的解決方法就是在服務器啟動之前 ,事先創建一些線程對象,然後,當處理客戶端請求時,就從這些建好的線程中 獲得線程對象,並處理請求。保存這些線程對象的結構就叫做線程池。
在C#中可以通過System.Threading.ThreadPool類來實現,在默認情況下, ThreadPool最大可建立500個工作線程和1000個I/O線程(根據機器CPU個數和.Net framework版本的不同,這些數據可能會有變化)。下面是一個用C#從線程池獲得 線程的例子:
private static void execute(object state)
{
Console.WriteLine(state);
}
static void Main(string[] args)
{
int workerThreads;
int completionPortThreads;
ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);
Console.WriteLine(workerThreads);
Console.WriteLine(completionPortThreads);
ThreadPool.QueueUserWorkItem(execute,"線程1"); // 從線程池中得到一個線程,並運行execute
ThreadPool.QueueUserWorkItem(execute, "線程2");
ThreadPool.QueueUserWorkItem(execute, "線程3");
Console.ReadLine();
}
下圖為上面代 碼的運行結果。
要注意的是,使用ThreadPool獲得的線程都是後台線程。