簡介 過去普通電腦只有計算單元,卻不能同時執行多個任務。然而操作系統卻已經可以同時運行多個應用程式,即實現了多任務的概念。為了防止一個應用程式控制CPU而導致其他應用程式和操作系統本身永遠被掛起這一可能情況,操作系統不得不使用某種方式 將物理計算單元分割為一些虛擬的進程,並給予每個程式一定量的計算 ...
簡介
過去普通電腦只有計算單元,卻不能同時執行多個任務。然而操作系統卻已經可以同時運行多個應用程式,即實現了多任務的概念。為了防止一個應用程式控制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。另外還有一些其他的線程狀態,但是要麼已經被棄用,要麼沒有我們試驗過的幾種狀態有用。