對於線程而言有兩種類型:前台線程,后台線程。前台與后台線程性質相同,但終止條件不同。
后台線程:在運行過程中如果宿主進程結束,線程將直接終止執行;在強制終止時,線程即終止執行不論線程代碼是否執行完畢。
前台線程:在運行過程中如果宿主進程結束,線程將繼續執行直至線程代碼執行完畢;在強制終止時,線程即結束不論線程代碼是否執行完畢。
后台線程生命周期:

上圖顯示:只要宿主進程結束,后台線程必定結束

上圖顯示:后台線程功能執行完畢或被強行終止即進入結束狀態,此時宿主進程並未結束
-----------------------------------------------------------------------------------------------------------------
前台線程生命周期:

上圖顯示:前台線程功能執行完畢或被強行終止即進入結束狀態,此時宿主進程並未結束

上圖顯示:宿主進程執行完畢,但前台線程功能未執行完畢的情況下,線程將不再依賴進程繼續執行,直到代碼執行完畢
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 異常處理,因為在強制結束未執行完成的線程時會拋出該異常。
