借這次考試系統的機會,學習學習多線程技術,和以往的學習過程相同:在學習新知識之前,先去知道這些知識是什麼、從何而來、用在哪裡、優缺點是什麼,這樣可以為知識建立一個方向,不會學得迷了路。
多線程基礎
基礎
在說多線程以前,得先了解一下什麼是線程,線程是程序執行的基本單位,一個進程可以由一個或多個線程組成。利用多個線程同時處理的編程理念就是多線程處理,多線程並不是真正多個線程同時占有CPU,任一時刻只能有一個線程占用CPU,只是同時爭奪CPU更頻繁,因為每個線程占用CPU的時間都非常短,宏觀上感覺是同時進行,線程的優先級也並不是讓該進程先執行,而是CPU分配給該線程的時間更多而已。
一般我們使用多線程,是因為多線程處理的效率更高,如果一個進程要完成兩個任務:A為A1→B1→C1,B為A2→B2→C2,同步和異步處理情況如圖:
如果用總長度代表進程所用時間,異步明顯比同步方式花費的時間少,所以在正確使用多線程編程情況下,可以很好的提高應用程序的性能和運行效率。
上下文Context
包括線程執行所需要的所有信息,包括CPU寄存器、堆棧等。
應用程序域
和變量類似,總得需要有個應用范圍的,而應用程序域正是這個作用,應用程序域可以防止因一個程序停止而導致其它程序停止,起到隔離作用,提高了系統的安全和穩定性。
類和命名空間
使用多線程,自然離不開命名空間System.Threading和類Thread。Thread最常用的這幾個函數:
創建線程:
[csharp]
//不帶參數
Thread ts = new Thread(new ThreadStart(ThreadProc));
//帶參數
Thread SuperMan = new Thread(new ParameterizedThreadStart(RunnerWork));
//不帶參數
Thread ts = new Thread(new ThreadStart(ThreadProc));
//帶參數
Thread SuperMan = new Thread(new ParameterizedThreadStart(RunnerWork)); 終止線程:[csharp] view plaincopyprint?
//終止進程
Thread ts = new Thread(new ThreadStart(ThreadProc));
ts.Abort();
//終止進程
Thread ts = new Thread(new ThreadStart(ThreadProc));
ts.Abort(); 暫停線程:[csharp] view plaincopyprint?
Thread.Sleep(1000);
Thread.Sleep(1000); 線程的掛起和喚醒,因為本身的安全和穩定性隱患,已經成為微軟宣布的過時用法。
什麼時候用多線程?
多線程的主要優點就是效率高、節省時間,所以如果多個線程所需要的系統資源是比較均勻的,這時可以讓它們異步並發執行。
同時多線程也存在多個缺點:不易控制;搶奪資源等。
所以如果多個線程都要搶占某一個資源或某幾個資源,則最好不用異步線程執行。因為並發執行,很可能同時爭奪某個資源,執行資源分配算法都會花費較多時間;創建線程容易但是控制線程比較難,如果使用多線程可能發生致命錯誤,它節省的這點時間我們還是別要了;線程越多,肯定占用的資源越多,這點就會受到內存、CPU等硬件限制,使用多線程還是要考慮這些硬件問題的。
總的來說,多線程就是用空間換時間;至於多少個線程合適?凡事都有度,中庸即可。
顯示多線程數
默認情況下任務管理器是隱藏進程的線程數目的,可以采用以下方法讓線程數可視: