日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# ThreadPool类(线程池)

發(fā)布時(shí)間:2025/7/25 C# 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# ThreadPool类(线程池) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

地址:https://www.cnblogs.com/scmail81/archive/2018/08/19/9503266.html

?

?

CLR線程池并不會(huì)在CLR初始化時(shí)立即建立線程,而是在應(yīng)用程序要?jiǎng)?chuàng)建線程來(lái)運(yùn)行任務(wù)時(shí),線程池才初始化一個(gè)線程。
線程池初始化時(shí)是沒(méi)有線程的,線程池里的線程的初始化與其他線程一樣,但是在完成任務(wù)以后,該線程不會(huì)自行銷毀,而是以掛起的狀態(tài)返回到線程池。直到應(yīng)用程序再次向線程池發(fā)出請(qǐng)求時(shí),線程池里掛起的線程就會(huì)再度激活執(zhí)行任務(wù)。
這樣既節(jié)省了建立線程所造成的性能損耗,也可以讓多個(gè)任務(wù)反復(fù)重用同一線程,從而在應(yīng)用程序生存期內(nèi)節(jié)約大量開(kāi)銷。

通過(guò)CLR線程池所建立的線程總是默認(rèn)為后臺(tái)線程,優(yōu)先級(jí)數(shù)為ThreadPriority.Normal。

CLR線程池分為工作者線程(workerThreads)I/O線程(completionPortThreads)兩種:

  • 工作者線程是主要用作管理CLR內(nèi)部對(duì)象的運(yùn)作,通常用于計(jì)算密集的任務(wù)。
  • I/O(Input/Output)線程主要用于與外部系統(tǒng)交互信息,如輸入輸出,CPU僅需在任務(wù)開(kāi)始的時(shí)候,將任務(wù)的參數(shù)傳遞給設(shè)備,然后啟動(dòng)硬件設(shè)備即可。等任務(wù)完成的時(shí)候,CPU收到一個(gè)通知,一般來(lái)說(shuō)是一個(gè)硬件的中斷信號(hào),此時(shí)CPU繼續(xù)后繼的處理工作。在處理過(guò)程中,CPU是不必完全參與處理過(guò)程的,如果正在運(yùn)行的線程不交出CPU的控制權(quán),那么線程也只能處于等待狀態(tài),即使操作系統(tǒng)將當(dāng)前的CPU調(diào)度給其他線程,此時(shí)線程所占用的空間還是被占用,而并沒(méi)有CPU處理這個(gè)線程,可能出現(xiàn)線程資源浪費(fèi)的問(wèn)題。如果這是一個(gè)網(wǎng)絡(luò)服務(wù)程序,每一個(gè)網(wǎng)絡(luò)連接都使用一個(gè)線程管理,可能出現(xiàn)大量線程都在等待網(wǎng)絡(luò)通信,隨著網(wǎng)絡(luò)連接的不斷增加,處于等待狀態(tài)的線程將會(huì)很消耗盡所有的內(nèi)存資源??梢钥紤]使用線程池解決這個(gè)問(wèn)題。

  線程池的最大值一般默認(rèn)為1000、2000。當(dāng)大于此數(shù)目的請(qǐng)求時(shí),將保持排隊(duì)狀態(tài),直到線程池里有線程可用。

  使用CLR線程池的工作者線程一般有兩種方式:

  • 通過(guò)ThreadPool.QueueUserWorkItem()方法;
  • 通過(guò)委托;

  要注意,不論是通過(guò)ThreadPool.QueueUserWorkItem()還是委托,調(diào)用的都是線程池里的線程。

通過(guò)以下兩個(gè)方法可以讀取和設(shè)置CLR線程池中工作者線程與I/O線程的最大線程數(shù)。

  • ThreadPool.GetMax(out in workerThreads,out int completionPortThreads);
  • ThreadPool.SetMax(int workerThreads,int completionPortThreads);
  •   若想測(cè)試線程池中有多少線程正在投入使用,可以通過(guò)ThreadPool.GetAvailableThreads(out in workThreads,out int conoletionPortThreads)方法。

    方法說(shuō)明
    GetAvailableThreads剩余空閑線程數(shù)
    GetMaxThreads最多可用線程數(shù),所有大于此數(shù)目的請(qǐng)求將保持排隊(duì)狀態(tài),直到線程池線程變?yōu)榭捎?/td>
    GetMinThreads檢索線程池在新請(qǐng)求預(yù)測(cè)中維護(hù)的空閑線程數(shù)
    QueueUserWorkItem啟動(dòng)線程池里得一個(gè)線程(隊(duì)列的方式,如線程池暫時(shí)沒(méi)空閑線程,則進(jìn)入隊(duì)列排隊(duì))
    SetMaxThreads設(shè)置線程池中的最大線程數(shù)
    SetMinThreads設(shè)置線程池最少需要保留的線程數(shù)

    我們可以使用線程池來(lái)解決上面的大部分問(wèn)題,跟使用單個(gè)線程相比,使用線程池有如下優(yōu)點(diǎn):

    1、縮短應(yīng)用程序的響應(yīng)時(shí)間。因?yàn)樵诰€程池中有線程的線程處于等待分配任務(wù)狀態(tài)(只要沒(méi)有超過(guò)線程池的最大上限),無(wú)需創(chuàng)建線程。

    2、不必管理和維護(hù)生存周期短暫的線程,不用在創(chuàng)建時(shí)為其分配資源,在其執(zhí)行完任務(wù)之后釋放資源。

    3、線程池會(huì)根據(jù)當(dāng)前系統(tǒng)特點(diǎn)對(duì)池內(nèi)的線程進(jìn)行優(yōu)化處理。

    總之使用線程池的作用就是減少創(chuàng)建和銷毀線程的系統(tǒng)開(kāi)銷。在.NET中有一個(gè)線程的類ThreadPool,它提供了線程池的管理。

    ThreadPool是一個(gè)靜態(tài)類,它沒(méi)有構(gòu)造函數(shù),對(duì)外提供的函數(shù)也全部是靜態(tài)的。其中有一個(gè)QueueUserWorkItem方法,它有兩種重載形式,如下:

    public static bool QueueUserWorkItem(WaitCallback callBack):將方法排入隊(duì)列以便執(zhí)行。此方法在有線程池線程變得可用時(shí)執(zhí)行。

    public static bool QueueUserWorkItem(WaitCallback callBack,Object state):將方法排入隊(duì)列以便執(zhí)行,并指定包含該方法所用數(shù)據(jù)的對(duì)象。此方法在有線程池線程變得可用時(shí)執(zhí)行。

    QueueUserWorkItem方法中使用的的WaitCallback參數(shù)表示一個(gè)delegate,它的聲明如下:

    public delegate void WaitCallback(Object state)

    如果需要傳遞任務(wù)信息可以利用WaitCallback中的state參數(shù),類似于ParameterizedThreadStart委托。

    下面是一個(gè)ThreadPool的例子,代碼如下:

    using System; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Threading;namespace ConsoleApp1 {class ThreadPoolDemo{public ThreadPoolDemo(){}public void Work(){ThreadPool.QueueUserWorkItem(new WaitCallback(CountProcess));ThreadPool.QueueUserWorkItem(new WaitCallback(GetEnvironmentVariables));}/// <summary> /// 統(tǒng)計(jì)當(dāng)前正在運(yùn)行的系統(tǒng)進(jìn)程信息 /// </summary> /// <param name="state"></param> private void CountProcess(object state){Process[] processes = Process.GetProcesses();foreach (Process p in processes){try{Console.WriteLine("進(jìn)程信息:Id:{0},ProcessName:{1},StartTime:{2}", p.Id, p.ProcessName, p.StartTime);}catch (Win32Exception e){Console.WriteLine("ProcessName:{0}", p.ProcessName);}finally{}}Console.WriteLine("獲取進(jìn)程信息完畢。");}/// <summary> /// 獲取當(dāng)前機(jī)器系統(tǒng)變量設(shè)置 /// </summary> /// <param name="state"></param> public void GetEnvironmentVariables(object state){IDictionary list = System.Environment.GetEnvironmentVariables();foreach (DictionaryEntry item in list){Console.WriteLine("系統(tǒng)變量信息:key={0},value={1}", item.Key, item.Value);}Console.WriteLine("獲取系統(tǒng)變量信息完畢。");}} } using System; using System.Threading;namespace ConsoleApp1 {class Program{static void Main(string[] args){ThreadPoolDemo tpd1 = new ThreadPoolDemo();tpd1.Work();Thread.Sleep(5000);Console.WriteLine("OK");Console.ReadLine();}} }

    轉(zhuǎn)載于:https://www.cnblogs.com/zxtceq/p/10980480.html

    總結(jié)

    以上是生活随笔為你收集整理的C# ThreadPool类(线程池)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。