近来在学习Eugene Agafonov编写的《C#多线程编程实战》(译),做些笔记也顺便分享一下^-^
using System; using System.Threading; namespace 检测线程状态 { class Program { static void Main(string[] args) { 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()); Console.ReadKey(); } static void DoNothing() { Thread.Sleep(TimeSpan.FromSeconds(2));//阻塞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); } } } }
线程状态位于Thread对象的ThreadState属性中,是一个枚举对象。刚开始的线程状态为ThreadState.Unstarted。然后我们启动线程,并估计在一个周期为30次迭代的区间中,线程状态会从ThreadState.Running变为ThreadState.WaitSleepJoin。
终止第一个线程后,会看到该线程的状态为ThreadState.Aborted,在程序的最后t2线程成功完成且状态为ThreadState.Stopped。这些都是线程状态的一些实例,可以让大家更清楚的认识到线程状态具体的变化。不过需要注意的是,不要在程序中使用线程终止,会造成无法预计的错误,这里使用只是为了展示相应的线程状态!