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

转载于:https://www.cnblogs.com/dw039/p/7397828.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值