開源線程池組件SmartThreadPool


1、為什么需要使用線程池(Thread Pool)

  • 減少線程間上下文切換。線程執行一定的時間片后,系統會自動把cpu切換給另一個線程使用,這時還需要保存當前的線程上下文狀態,並加載新線程的上下文狀態。當程序中有大量的線程時,每個線程分得的時間片會越來越少,可能會出現線程未處理多少操作,就需要切換到另一線程,這樣頻繁的線程間上下文切換會花費大量的cpu時間。
  • 減少內存占用。系統每創建一條物理線程,需要大概花費1MB的內存空間,許多程序喜歡先創建多條物理線程,並周期輪詢來處理各自的任務,這樣既消耗了線程上下文切換的時間,還浪費了內存。這些任務可能只需要一條線程就能滿足要求。假如某一任務需要執行較長的周期,線程池還可以自動增加線程,並在空閑時,銷毀線程,釋放占用的內存。

2、為什么不使用.Net默認的線程池

  • .Net默認的線程池(ThreadPool)是一個靜態類,所以是沒辦法自己創建一個新的程序池的。默認的線程池與應用程序域(AppDomain)掛鈎,一個AppDomain只有一個線程池。假如在線程池中執行了一個周期較長的任務,一直占用着其中一個線程,可能就會影響到應用程序域中的其他程序的性能。例如,假如在Asp.Net的線程池中執行一個周期較長的任務,就會影響請求的並發處理能力(線程池默認有個最大線程數)。 3、SmartThreadPool特性和優點

SmartThreadPool特性如下:

  • 池中的線程數量會根據負載自動增減
  • 任務異步執行后可以返回值
  • 處於任務隊列中未執行的任務可以取消
  • 回調函數可以等待多個任務都執行完成后再觸發
  • 任務可以有優先級(priority)
  • 任務可以分組
  • 支持泛型Action<T> 和 Func<T>
  • 有性能監測機制

4、使用示例 最簡單的使用方法:

 // 創建一個線程池
SmartThreadPool smartThreadPool = new SmartThreadPool();

 // 執行任務
smartThreadPool.QueueWorkItem(() =>
{
     Console.WriteLine("Hello World!");
});

帶返回值的任務:

// 創建一個線程池
SmartThreadPool smartThreadPool = new SmartThreadPool();

// 執行任務
var result = smartThreadPool.QueueWorkItem(() =>
{
    var sum = 0;
    for (var i = 0; i < 10; i++)
        sum += i;

    return sum;
});

// 輸出計算結果
Console.WriteLine(result.Result);

等待多個任務執行完成:

// 創建一個線程池
SmartThreadPool smartThreadPool = new SmartThreadPool();

// 執行任務
var result1 = smartThreadPool.QueueWorkItem(() =>
{
    //模擬計算較長時間
    Thread.Sleep(5000);

    return 3;
});

var result2 = smartThreadPool.QueueWorkItem(() =>
{
    //模擬計算較長時間
    Thread.Sleep(3000);

    return 5;
});

bool success = SmartThreadPool.WaitAll(
    new IWorkItemResult[] { result1, result2 });

if (success)
{
    // 輸出結果
    Console.WriteLine(result1.Result);
    Console.WriteLine(result2.Result);
}

5、結論 使用SmartThreadPool可以簡單就實現支持多線程的程序,由線程池來管理線程,可以減少死鎖的出現。SmartThreadPool還支持簡單的生產者-消費者模式,當不需要對任務進行持久化時,還是很好用的。 6、擴展閱讀 http://www.codeproject.com/KB/threads/smartthreadpool.aspx http://smartthreadpool.codeplex.com/ http://www.albahari.com/threading/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM