關於多線程學習總結(五) 線程池

必須得說點什麼

今天在介紹線程池以前,我得來講說上上篇隨筆。關於線程的優先級,咱們知道在C#中能夠設置線程的優先級,使重要的做業能夠優先執行,可是這個優先級不是一成不變的,也就是說就算你設置一個線程的優先級很是高,可是也有可能在優先級較低的線程後執行。優先級高不表明就獲得了絕對的通行證,給一個例子你們看看:多線程

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Thread test1 = new Thread(new ThreadStart(myThread1));
 6             test1.Priority = ThreadPriority.Lowest;
 7             Thread test2 = new Thread(new ThreadStart(myThread2));
 8             test2.Priority = ThreadPriority.Highest;
 9             Thread test3 = new Thread(new ThreadStart(myThread3));
10             test3.Priority = ThreadPriority.Normal;
11             test1.Start();
12             test2.Start();
13             test3.Start();
14             Console.WriteLine("結束");
15             Console.ReadKey();
16         }
17 
18         public static void myThread1()
19         {
20             Console.WriteLine("個人線程1");
21         }
22         public static void myThread2()
23         {
24             Thread.Sleep(5000);
25             Console.WriteLine("個人線程2");
26         }
27         public static void myThread3()
28         {
29             Thread.Sleep(3000);
30             Console.WriteLine("個人線程3");
31         }
32     }

在上面的例子中咱們爲線程1設置了最低優先級,線程2設置最高優先級,線程3設置中等優先級,而後在在後面三個方法中分別調用Sleep()方法,使其阻塞,最終咱們獲得的結果以下所示:異步

結束spa

個人線程1線程

個人線程3code

個人線程2orm

看了這個是否是有點感受了呢?其實在C#中多線程是個挺怪異的東東,它收到多方面因數的影響,從而致使優先級的執行撲朔迷離,每次執行均可能不一樣。blog

線程池

其實我看到線程池這個東西,天生就有種恐懼感,總以爲它很神祕,屬於深奧的東西,今天小弟還真得探它一探、、、隊列

關於線程池的概念,其實線程池是一種多線程處理形式,處理過程當中將任務添加到隊列,而後在建立線程後自動啓動這些任務。線程池線程都是後臺線程哦,每一個線程池都使用默認的堆棧大小,以默認的優先級執行,並處理多線程單元中。內存

並且咱們都知道一個應用程序能夠包含多個線程,這麼多的線程管理起來很費力,因而線程池的出現能夠幫咱們解決相關問題。可是有幾點咱們須要知道哦,線程池這個東東哇也有很差的地方,有些地方還真使用它不合適,這點後面道來。string

ThreadPool類

下面來看看MSDN吧,我發現我愈來愈愛它了,Wonderful

ThreadPool的概念:提供一個線程池,該線程池可用於發送工做項、處理異步 I/O、表明其餘線程等待以及處理計時器。

關於ThreadPool 它有相關的成員

以上線程的成員咱們能夠沒事兒玩一哈:

 1 int x, y,m,n;
 2 ThreadPool.GetMaxThreads(out x, out y);  //檢索能夠同時處於活動狀態的線程池請求的數目。全部大於此數目的請求將保持排隊狀態,直到線程池線程變爲可用。 
 3 Console.WriteLine("第一次調用GetMaxThreads" + x + "----" + y);      //x指最大線程數,y指異步IO最大線程數
 4 ThreadPool.GetMinThreads(out m, out n);  //線程池在新請求預測中維護的空閒線程數
 5 Console.WriteLine("第一次調用GetMinThreads"+m + "----" + m);  //m指最小線程數,n指異步IO最小線程數
 6 ThreadPool.SetMaxThreads(100,1000);
 7 ThreadPool.GetMaxThreads(out x, out y);  //檢索能夠同時處於活動狀態的線程池請求的數目。全部大於此數目的請求將保持排隊狀態,直到線程池線程變爲可用。 
 8 Console.WriteLine("第二次調用GetMaxThreads" + x + "----" + y);      //x指最大線程數,y指異步IO最大線程數
 9 Console.WriteLine("結束");
10 Console.ReadKey();

其實這些東西蠻有意思的,先看看以上代碼執行結果:

這段代碼執行是沒有任何問題的,但是咱們改兩個地方,以下所示:

1 ThreadPool.SetMaxThreads(100000,1000);
2 ThreadPool.SetMinThreads(3,1000);

你們猜執行的結果是啥?呵呵試試就知道了,你猜的結果極可能都錯了,當咱們設置最小線程數大於1023時咱們再調用GetMaxThreads方法,咱們會發現不管如何最大線程數都是1023。爲何會這樣?咱們都知道線程有利也有弊,弊端在這裏就有所體現,過多的線程致使線程間調度過分頻繁,致使線程執行的時間比調度的時間還短,同時又佔據更多的內存,因此在這裏線程池不容許。

結合上面的成員,練習練習,木有錯的、、、、

這個不應出現的結尾

其實關於線程池這個還有一些其餘的知識木有提到,好比AutoResetEvent啦,ThreadPool.RegisterWaitForSingleObject啦,今天因爲不可抗拒的緣由到此停筆,貌似看到此處的園友必定以爲好坑,不過不要緊啦,不掉進去怎麼會知道那有個坑呢?你說是吧,呵呵,對不住了、、、

------若是你以爲此文對你有所幫助,別忘了點擊下右下角的推薦咯,謝謝!------

相關文章
相關標籤/搜索