解析線程池

線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然後在創建線程後自動啓動這些任務。線程池線程都是後臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,並處於多線程單元中。如果某個線程在託管代碼中空閒(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間後創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成後才啓動。

服務器程序如何利用線程池來優化性能?
1、線程池管理器(ThreadPoolManager):用於創建並管理線程池
2、工作線程(WorkThread): 線程池中線程
3、任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執行。
4、任務隊列:用於存放沒有處理的任務。提供一種緩衝機制。

線程池功能:
應用程序可以有多個線程,這些線程在休眠狀態中需要耗費大量時間來等待事件發生。其他線程可能進入睡眠狀態,並且僅定期被喚醒以輪循更改或更新狀態信息,然後再次進入休眠狀態。爲了簡化對這些線程的管理,.NET框架爲每個進程提供了一個線程池,一個線程池有若干個等待操作狀態,當一個等待操作完成時,線程池中的輔助線程會執行回調函數。線程池中的線程由系統管理,程序員不需要費力於線程管理,可以集中精力處理應用程序任務

應用範圍:
1、需要大量的線程來完成任務,且完成任務的時間比較短。 WEB服務器完成網頁請求這樣的任務,使用線程池技術是非常合適的。因爲單個任務小,而任務數量巨大,你可以想象一個熱門網站的點擊次數。 但對於長時間的任務,比如一個Telnet連接請求,線程池的優點就不明顯了。因爲Telnet會話時間比線程的創建時間大多了。
2、對性能要求苛刻的應用,比如要求服務器迅速響應客戶請求。
3、接受突發性的大量請求,但不至於使服務器因此產生大量線程的應用。突發性大量客戶請求,在沒有線程池情況下,將產生大量線程,雖然理論上大部分操作系統線程數目最大值不是問題,短時間內產生大量線程可能使內存到達極限,並出現”OutOfMemory”的錯誤。

代碼示例:

//線程池示例
using System;
using System.Threading;

public classTest
{
    //存放要計算的數值的字段
    static double number1 = -1;
    static double number2 = -1;

    public static void Main()
    {
        //獲取線程池的最大線程數和維護的最小空閒線程數
        int maxThreadNum, minThreadNum;
        int portThreadNum;

        ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
        ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
        Console.WriteLine("最大線程數:{0}", maxThreadNum);
        Console.WriteLine("最小線程數:{0}", minThreadNum);

        //函數變量值
        int x=15600;
        //啓動第一個任務:計算x的8次方
        Console.WriteLine("啓動第一個任務:計算{0}的8次方。", x);
        ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);

        //啓動第二個任務:計算x的8次方根
        Console.WriteLine("啓動第二個任務:計算{0}的8次方根。", x);
        ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);

        //等待,直到兩個數值都完成計算
        while(number1 == -1 || number2 == -1);
        //打印計算結果
        Console.WriteLine("y({0}) = {1}", x, number1 + number2);
        Console.Read();
    }

    //啓動第一個任務:計算x的8次方
    static void TaskProc1(object o)
    {
        number1 = Math.Pow(Convert.ToDouble(o), 8);
    }

    //啓動第二個任務:計算x的8次方根
    static void TaskProc2(object o)
    {
        number2 = Math.Pow(Convert.ToDouble(o), 1.0/8.0);
    }
}
//池結構
[HostProtection(SecurityAction.LinkDemand,Synchronization=true,ExternalThreading=true)]

public static class ThreadPool
{
[Obsolete("ThreadPool.BindHandle(IntPtr)hasbeendeprecated.PleaseuseThreadPool.BindHandle(SafeHandle)instead.",false),SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.UnmanagedCode)]
public static bool BindHandle(IntPtr osHandle)
{
    if(osHandle == null){throw new ArgumentNullException("osHandle");}
    bool flag = false;
    bool success = false;
    RuntimeHelpers.PrepareConstrainedRegions();
    try
    {
        osHandle.DangerousAddRef(ref success);
        flag = BindIOCompletionCallbackNative(osHandle.DangerousGetHandle());
    }
    finally
    {
        if(success)
            osHandle.DangerousRelease();
    }
    return flag;
}
發佈了79 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章