例項程式碼講解c# 執行緒(上)
簡介
過去普通計算機只有計算單元,卻不能同時執行多個任務。然而作業系統卻已經可以同時執行多個應用程式,即實現了多工的概念。為了防止一個應用程式控制CPU而導致其他應用程式和作業系統本身永遠被掛起這一可能情況,作業系統不得不使用某種方式 將物理計算單元分割為一些虛擬的程序,並給予每個程式一定量的計算能力。此外,作業系統必須始終能夠優先訪問CPU,並能調整不同程式訪問CPU的優先順序。執行緒正是這一概念的實現。可以認為執行緒是一個虛擬程序,用於獨立執行一個特定的程式。 (請記住執行緒會消耗大量的作業系統資源。多個執行緒共享一個物理處理器將導致作業系統忙於管理這些執行緒,而無法執行程式。)
接下來建立一個控制檯應用程式
class Program { static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start(); PrintNumbers(); Console.ReadKey(); } static void PrintNumbers() { Console.WriteLine("Starting..."); for (int i = 1; i < 10; i++) { Console.WriteLine(i); } } }
結果兩組範圍為1到10的數字會隨機交叉輸出。這說明了printnumbers方法同時執行在主執行緒和另一個執行緒中。
static void DoNothing() { Thread.Sleep(TimeSpan.FromSeconds(2)); } static void PrintNumbersWithStatus() { Console.WriteLine("Starting..."); Console.WriteLine(Thread.CurrentThread.ThreadState.ToString()); for (int i = 1; i < 10; i++) { Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine(i); } }
在main方法中加入以下程式碼片段
Console.WriteLine("Starting program..."); Thread t = new Thread(PrintNumbersWithStatus); Thread t2 = new Thread(DoNothing); Console.WriteLine(t.ThreadState.ToString()); t2.Start(); t.Start(); for (int i = 1; i < 30; i++) { Console.WriteLine(t.ThreadState.ToString()); } Thread.Sleep(TimeSpan.FromSeconds(6)); t.Abort(); Console.WriteLine("A thread has been aborted"); Console.WriteLine(t.ThreadState.ToString()); Console.WriteLine(t2.ThreadState.ToString());
工作原理 當主程式啟動時定義了兩個不同的執行緒。一個將被終止,另一個則會成功完成執行。執行緒狀態位於Thread物件的ThreadState屬性中。ThreadState屬性是一個C#列舉物件。剛開始執行緒狀態為ThreadState.Unstarted。然後我們啟動執行緒,並估計在一個週期30次迭代的區間中,執行緒狀態會從ThreadState.Running變為ThreadState.WaitSleepJoin。 如果實際情況與以上不符,請增加迭代次數,終止第一個執行緒後,會看到現在該執行緒狀態為ThreadState.Aborted。程式也有可能會打印出ThreadState.AbortRequested狀態。這充分說明了同步兩個執行緒的複雜性。請記住不要在程式中使用執行緒終止。我在這裡使用他只是為了展示相應的執行緒狀態。最後可以看到第二個執行緒t2成功完成並且狀態為ThreadState.Stopped。另外還有一些其他的執行緒狀態,但是要麼已經被棄用,要麼沒有我們試驗過的幾種狀態有用。