C#多线程的用法2-线程的生命周期

对于线程而言有两种类型:前台线程,后台线程。前台与后台线程性质相同,但终止条件不同。

后台线程:在运行过程中如果宿主进程结束,线程将直接终止执行;在强制终止时,线程即终止执行不论线程代码是否执行完毕。

前台线程:在运行过程中如果宿主进程结束,线程将继续执行直至线程代码执行完毕;在强制终止时,线程即结束不论线程代码是否执行完毕。

后台线程生命周期:

上图显示:只要宿主进程结束,后台线程必定结束

上图显示:后台线程功能执行完毕或被强行终止即进入结束状态,此时宿主进程并未结束

 

-----------------------------------------------------------------------------------------------------------------

前台线程生命周期:

上图显示:前台线程功能执行完毕或被强行终止即进入结束状态,此时宿主进程并未结束

上图显示:宿主进程执行完毕,但前台线程功能未执行完毕的情况下,线程将不再依赖进程继续执行,直到代码执行完毕

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 异常处理,因为在强制结束未执行完成的线程时会抛出该异常。

posted @ 2017-08-19 20:32  DW039  阅读(3208)  评论(0编辑  收藏  举报