線程:是Windows任務調度的最小單位。線程是程序中的一個執行流,每個線程都有自己的專有寄存器(棧指針、程序計數器等),但代碼區是共享的,即不同的線程可以執行同樣的函數,在一個應用程序中,常常需要使用多個線程來處理不同的事情,這樣可以提高程序的運行效率,也不會使主界面出現無響應的情況。在這里主要介紹線程(Thread)、線程池(ThreadPool)兩種不同創建線程的區別
在通常的情況下,當我們需要開啟一個新的線程時,我們直接通過Thread(繼承自 System.Threading;)去創建一個新的線程,這樣做有一個好處就是我們可以拿到這個新創建的線程,並且可以對這個線程去做一些相關的操作。但是通過創建一個新的線程會比較消耗資源,我們都知道,操作系統的資源是有限的,當用戶訪問的多了,需要開啟的線程也跟着多了,當開啟的線程超過系統的最大線程數時,系統就容易出現崩潰。下面我們來看一下創建100個線程所需要的時間
for (int i = 0; i < 100; i++)//創建100個線程 { new Thread(() => { Console.WriteLine("創建線程的ID為:"+Thread.CurrentThread.ManagedThreadId); }).Start(); } sw.Stop(); Console.WriteLine("創建100個線程執行的時間為:"+sw.ElapsedMilliseconds.ToString());
運行后我們發現創建100個線程的時間為489ms,並且每個線程都不同。當創建的線程數超過系統的最大線程數的話,那么系統直接over了。有沒有解決的辦法呢,答案當然是有的,就是線程池(ThreadPool)技術。
通過創建線程池對象,當需要使用線程時,就去池中看有沒有創建好的線程,有的話就直接將創建好的線程拿出來,線程池中沒有的話,就新創建一個線程,當線程使用完后,將放回線程池中供下次使用,這樣不僅可以減少創建線程消耗的時間以及消耗的內存,還能夠提高線程的利用率。
for (int i = 0; i < 100; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { Console.WriteLine("創建線程的ID為:" + Thread.CurrentThread.ManagedThreadId); })); }
從上面的運行結果我們可以發現,通過線程池去創建的線程,或者更准確點應該是去線程池獲取線程比創建線程所花的時間簡直是天差地別,線程的ID也是重復的,這也是通過線程池來獲取線程可以提高線程的利用率。在這里需要注意的一點是通過線程池獲取的線程都默認為后台線程
最后,簡單的介紹一下Task工作任務項,Task為.net4.0引入的新的使用線程池技術,微軟的MSDN上這樣介紹:Task 類的表示的單個操作不會返回一個值,通常以異步方式執行。 Task 對象是一種的中心思想 基於任務的異步編程模式 首次引入.NET Framework 4 中。
在通過工廠開啟的新的線程池工作任務項,會直接執行,而通過自己創建的新飛工作任務項,需要自己手動去開啟執行
//使用工廠創建一個工作任務項,並執行了 Task t1 = Task.Factory.StartNew(() => { //執行代碼 }); //Task t1 = new Task(() => // { // Thread.Sleep(2000); // Console.WriteLine("當前的線程是:"+Thread.CurrentThread.ManagedThreadId); // }); //t1.Start();//需要手動啟動去執行
總結:在實際的開發中,當不需要對線程進行操作的話,不要手動去創建線程,盡量的使用線程池技術去創建開啟一個線程,可以提高線程的使用效率,使用線程池技術也可以提高應用程序的效率。