程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 淺談.NET下的多線程和並行計算(五)線程池基礎 上

淺談.NET下的多線程和並行計算(五)線程池基礎 上

編輯:關於ASP.NET

池(Pool)是一個很常見的提高性能的方式。比如線程池連接池等,之所以有這些池是因為線程和數 據庫連接的創建和關閉是一種比較昂貴的行為。對於這種昂貴的資源我們往往會考慮在一個池容器中放置 一些資源,在用的時候去拿,在不夠的時候添點,在用完就歸還,這樣就可以避免不斷的創建資源和銷毀 資源。

如果您做過相關實驗的話可能會覺得不以為然,似乎開1000個線程也用不了幾百毫秒。我們要這麼想 ,對於一個高並發的環境來說,每一秒假設有100個請求,每個請求需要使用(開和關)10個線程,也就 是一秒需要處理1000個線程的開和關,每個線程獨立堆棧1M,可以想象在這一秒中內存分配和回收是多麼 誇張,這個開銷不能說不昂貴。

首先,要理解線程池線程分為兩類工作線程和IO線程,可以單獨設置最小線程數和最大線程數:

ThreadPool.SetMinThreads(2, 2);
ThreadPool.SetMaxThreads(4, 4);

最大線程數很好理解,就是線程池最多創建這些線程,如果最大4個線程,現在這4個線程都在運行的 話,後續進來的線程只能排隊等待了。那麼為什麼有最小線程一說法呢?其實之所以使用線程池是不希望 線程在創建後運行結束後理解回收,這樣的話以後要用的時候還需要創建,我們可以讓線程池至少保留幾 個線程,即使沒有線程在工作也保留。上述語句我們設置線程池一開始就保持2個工作線程和2個IO線程, 最大不超過4個線程。

至於線程池的使用相當簡單先來看一段代碼:

for (int i = 0; i < totalThreads; i++)
{
   ThreadPool.QueueUserWorkItem(o =>
   {
     Thread.Sleep(1000);
     int a, b;
     ThreadPool.GetAvailableThreads(out a, out b);
     Console.WriteLine(string.Format("({0}/{1}) #{2} : {3}", a, b,  Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("mm:ss")));
   });
}
Console.WriteLine("Main thread finished");
Console.ReadLine();

代碼裡面用到了一個事先定義的靜態字段:

static readonly int totalThreads = 10;

代碼運行結果如下:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved