借這次考試系統的機會,學習學習多線程技術,和以往的學習過程相同:在學習新知識之前,先去知道這些知識是什麼、從何而來、用在哪裡、優缺點是什麼,這樣可以為知識建立一個方向,不會學得迷了路。 多線程基礎 基礎 在說多線程以前,得先了解一下什麼是線程,線程是程序執行的基本單位,一個進程可以由一個或多個線程組成。利用多個線程同時處理的編程理念就是多線程處理,多線程並不是真正多個線程同時占有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等硬件限制,使用多線程還是要考慮這些硬件問題的。 總的來說,多線程就是用空間換時間;至於多少個線程合適?凡事都有度,中庸即可。 顯示多線程數 默認情況下任務管理器是隱藏進程的線程數目的,可以采用以下方法讓線程數可視:
如圖中,進程Everything的14線程為正在參與運行的線程,與程序中的Thread對象數量無關。 下篇博客會綜合這些基礎內容,寫一關於賽跑的多線程實例。