Thread的Abort和Join方法總結
今天剛開始學多執行緒,儘管以前用過一點點,但是隻是照著網上程式碼抄,沒有真正理解,現在回過頭來想研究研究,慢慢弄懂,下面就是我在網上所找資料的例子,相信大家都看過,做了小點改動
0 View Code 1 namespace 多執行緒 2 { 3 public class Simple 4 { 5 6 public static int Main() 7 { 8 Console.WriteLine("Thread Start/stop/join sample"); 9 Alpha alpha = new Alpha(); 10 Thread t = new Thread(new ThreadStart(alpha.Beta)); 11 t.Start(); 12 while (!t.IsAlive) Thread.Sleep(1); 13 t.Abort(); 14 //t.Join(); 15 Console.WriteLine("alpha.Beta 已經結束,執行狀態為"+t.IsAlive.ToString()+"執行緒狀態為:"+t.ThreadState.ToString()); 16 try 17 { 18 Console.WriteLine("試圖重新啟動 19 t.Start(); 20 } 21 catch(ThreadStateException) { 22 Console.WriteLine("ThreadStateException 試圖重新啟動t執行緒"); 23 Console.WriteLine("t執行緒終止後不能被重啟"); 24 Console.ReadLine(); 25 } 26 return 0; 27 } 28 29 } 30 public class Alpha { 31 public void Beta() { 32 while (true) { 33 Console.WriteLine("Alpha.Beta 正在執行"); 34 } 35 } 36 } 37 } |
這段程式碼非常好懂,但是有一點我不懂的是我以前一直認為abort()方法會使執行緒終止,為什麼還要呼叫執行緒t的join方法呢?官方給的解釋是abort():以開始終止此執行緒的過程,呼叫此方法通常會終止此執行緒,join():阻止呼叫某個執行緒,直到某個執行緒終止為止。當時死都想不通這兩句話,直到把t.IsAlive(表示當前執行緒的執行狀態)和t.ThreadState(該值包含執行緒的狀態)打印出來後再想明白,現在先看看上面程式碼的執行結果:
奇怪,為什麼執行緒abort()後isalive執行狀態還是為TRUE呢,再看執行緒狀態為AbortRequested,這意思是說執行緒已呼叫abort,但執行緒還未停止,於是再想想執行緒沒停止,isalive屬性為TRUE就變得合理了,那下面TRY語句塊內再對執行緒重啟就會產生錯誤了,都沒停止何來產生重啟呢?
但是問題還沒有解決,如何才能讓執行緒終止呢,難道abort不能讓純種終止嗎?好了,先不要想那麼多,我們把上述程式碼中t.join()註釋符號給去掉,再來執行一下程式,結果如下:
好了,現在看看執行關態和執行緒狀態我們得知執行緒終止了,而我們知道,當一個執行緒再呼叫abort()後是不能再start()了,所以同樣會丟擲異常,執行catch語句。綜合兩種情況來看,開始我還以為,難道只用abort()不用join()就不能終止執行緒嗎?但是再對著兩種結果和兩個方法給出的介紹仔細想想就不難得出以下結論:
1.abort()的功能是用來終止呼叫此方法的執行緒的,只是在多數情況下,它需要一點時間,有些延遲(可能在短時間內此執行緒還在執行)...
2.join()方法它的功能不是終止執行緒,而是在t執行緒終止之前,阻止正在結束(呼叫了abort()方法但還未結束)的t執行緒執行,同時使主執行緒等待,直到t執行緒終止(也就是abort()方法終止過程完畢)了再執行下面的程式碼,打印出來的結果,執行狀態就為FALSE,執行緒狀態也為停止了
--------------------------------------------------------------------------------
注意:在沒有呼叫JOIN方法前,這段程式碼的執行結果可能為圖中兩種結果,都會存在,這可能根據電腦的不同,abort()執行時間有關,所以,這裡join保證了我們在執行下面的程式碼時,t執行緒實現了“真正”的終止,我想這就是join用在abort()後的妙處吧!