对于线程而言有两种类型:前台线程,后台线程。前台与后台线程性质相同,但终止条件不同。
后台线程:在运行过程中如果宿主进程结束,线程将直接终止执行;在强制终止时,线程即终止执行不论线程代码是否执行完毕。
前台线程:在运行过程中如果宿主进程结束,线程将继续执行直至线程代码执行完毕;在强制终止时,线程即结束不论线程代码是否执行完毕。
后台线程生命周期:
上图显示:只要宿主进程结束,后台线程必定结束
上图显示:后台线程功能执行完毕或被强行终止即进入结束状态,此时宿主进程并未结束
-----------------------------------------------------------------------------------------------------------------
前台线程生命周期:
上图显示:前台线程功能执行完毕或被强行终止即进入结束状态,此时宿主进程并未结束
上图显示:宿主进程执行完毕,但前台线程功能未执行完毕的情况下,线程将不再依赖进程继续执行,直到代码执行完毕
class="brush:csharp;gutter:true;">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 异常处理,因为在强制结束未执行完成的线程时会抛出该异常。