對於線程而言有兩種類型:前台線程,后台線程。前台與后台線程性質相同,但終止條件不同。
后台線程:在運行過程中如果宿主進程結束,線程將直接終止執行;在強制終止時,線程即終止執行不論線程代碼是否執行完畢。
前台線程:在運行過程中如果宿主進程結束,線程將繼續執行直至線程代碼執行完畢;在強制終止時,線程即結束不論線程代碼是否執行完畢。
后台線程生命周期:
上圖顯示:只要宿主進程結束,后台線程必定結束
上圖顯示:后台線程功能執行完畢或被強行終止即進入結束狀態,此時宿主進程並未結束
-----------------------------------------------------------------------------------------------------------------
前台線程生命周期:
上圖顯示:前台線程功能執行完畢或被強行終止即進入結束狀態,此時宿主進程並未結束
上圖顯示:宿主進程執行完畢,但前台線程功能未執行完畢的情況下,線程將不再依賴進程繼續執行,直到代碼執行完畢
private static void MultiThreadLifecycle() { ParameterizedThreadStart task = (sleep) => { int i = Convert.ToInt32(sleep); try { for (var i = 0; i < 10; i++) { Console.WriteLine(String.Format("Thread {0} Out:{1}", Thread.CurrentThread.Name, i)); Thread.Sleep(i); } Console.WriteLine(String.Format("Sub Thread {0} The End", Thread.CurrentThread.Name)); } catch (ThreadAbortException ex) { Console.WriteLine(String.Format("Sub Thread {0} Abort", Thread.CurrentThread.Name)); } }; Console.WriteLine("Main Thread"); Thread thread1 = new Thread(task) { Name = "thread1" }; Thread thread2 = new Thread(task) { Name = "thread2", IsBackground = true }; thread1.Start(5000); thread2.Start(5000); Console.WriteLine("Main Thread Wait Sub Thread"); thread1.Abort(); Console.ReadLine(); Console.WriteLine(String.Format("{0}:{1},{2}:{3}", thread1.Name, thread1.ThreadState, thread2.Name, thread2.ThreadState)); }
說明:
1、設置現成是否為后台線程,可通過線程對象的 IsBackground 屬性設置
2、強制終止線程可通過線程對象的Abort()方法進行,同時應該在線程中進行 ThreadAbortException 異常處理,因為在強制結束未執行完成的線程時會拋出該異常。