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

  • 相关阅读:
    BETA 版冲刺前准备
    Alpha 事后诸葛亮(团队)
    Learn Docker(一)—软件安装与常规操作
    Alpha 答辩总结
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    团队作业-随堂小测(同学录)
  • 原文地址:https://www.cnblogs.com/dw039/p/7397828.html
Copyright © 2020-2023  润新知