這次複習線程編程中涉及到的編程Thread的靜態方法與屬性,先看一段代碼:
using System;using System.Threading;namespace ThreadTest{public class ClassSample{public void Method(){while (true){Console.WriteLine("ClassSample中的Mehtod正在執行。");}}}class Program{public static void Main(string[] args){ClassSample classOne= new ClassSample();Thread threadSample = new Thread(new ThreadStart(classOne.Method));threadSample.Start();while(!threadSample.IsAlive)Thread.Sleep(1);threadSample.Abort();threadSample.Join();Console.WriteLine();Console.WriteLine("Class1中的Method1已經執行完畢。");try{Console.WriteLine("嘗試重新運行Class1的Method線程。");threadSample.Start();}catch(ThreadStateException){Console.WriteLine("重新運行失敗。");Console.WriteLine();}Console.ReadKey(true);}}}
注意到Thread threadSample = new Thread(new ThreadStart(classOne.Method));,所以當threadSample啟動時,執行的是classOne中的Method,具體的執行流程是,在Main函數中的while迴圈中,使用了靜態方法Thead.Sleep()讓主線程休眠了一毫秒,從而執行線程threadSample。
隨後執行ThreadSample.Abort()方法終止線程threadSample,在try迴圈中調用threadSample.Start()方法想重新啟動線程,但由於Abort()方法終止線程是不可恢複的,所以會拋出異常,程式執行完畢。
----------------------------------------------------------知識分割線----------------------------------------------------------------------
①首先看到代碼中的Main函數,所有線程都是依附於Main()函數所在的線程的,Main()函數是C#程式的入口,起始線程可以稱之為主線程。如果所有的前台線程都停止了,那麼主線程可以終止,而所有的後台線程都將無條件終止。所有的線程雖然在微觀上是串列執行的,但是在宏觀上你完全可以認為它們在並存執行。
②我們還需要瞭解Thread類的ThreadState屬性,這個屬性工作表示線程啟動並執行狀態,其取值有
Aborted:線程停止運行;
AbortRequested:Thread.Abort()方法已被調用,但線程還沒有停止;
Background:線程在後台執行,與屬性Thread.IsBackground有關;
Running:線程正在正常運行;
Stopped:線程已經被停止;
StopRequested:線程正在被要求停止;
Suspended:線程已經被掛起(此狀態下,可以通過調用Resume()方法重新運行);
SuspendRequested:線程正在要求被掛起,但是未來得及響應;
Unstarted:未調用Thread.Start()開始線程的運行;
WaitSleepJoin:線程因為調用了Wait(),Sleep()或Join()等方法處於封鎖狀態;
上面提到了Background狀態表示該線程在後台運行,那麼後台啟動並執行線程有什麼特別的地方呢?其實後台線程跟前台線程只有一個區別,那就是後台線程不妨礙程式的終止。一旦一個進程所有的前台線程都終止後,CLR(通用語言運行環境)將通過調用任意一個存活中的後台進程的Abort()方法來徹底終止進程。
③最後我也要瞭解Thread的優先順序,當CPU給不同的線程分配已耗用時間時,CPU是按照線程的優先順序給予分配的,在C#中,線程擁有五個不同的優先順序,由高到低分別是Highest、AboveNormal、Normal、BelowNormal和Lowest,可以通過下面的語句指定線程的優先順序:
threadSample.Priority = ThreadPriority.Hightest;
下面的代碼分別示範了上面提到的各種屬性:
using System;using System.Threading;namespace ThreadTest{public class ClassSample{int i;public void MethodSample(){i++;Console.WriteLine("ClassSample中的MehtodSample正在執行,此時i的值為:{0}",i);}}class Program{public static void Main(string[] args){ClassSample classOne = new ClassSample();Thread threadOne = new Thread(new ThreadStart(classOne.MethodSample));threadOne.Start();Thread.Sleep(1000); //主線程休眠1秒,執行MethodSample方法Console.WriteLine("threadOne此時的運行狀態為:{0}",threadOne.ThreadState);threadOne.Abort();Thread threadTwo = new Thread(new ThreadStart(classOne.MethodSample));//Console.WriteLine("threadOne此時的運行狀態為:{0}",threadOne.ThreadState);//如果threadTwo還沒有啟動,那麼ThreadOne的狀態應該是AbortRequestedthreadTwo.Start();Console.WriteLine("threadOne此時的運行狀態為:{0}",threadOne.ThreadState);Console.WriteLine("threadTwo此時的優先順序是:{0}",threadTwo.Priority);threadTwo.Priority=ThreadPriority.Highest;Console.WriteLine("threadTwo此時的優先順序是:{0}",threadTwo.Priority);Console.ReadKey(true);}}}
執行的結果如:
未完待續,下次複習多線程編程中Timer定時器的使用。