zoukankan      html  css  js  c++  java
  • 线程的Abort方法有感

    今天看CSDN上一个很老的帖子,有个人说Thread.Abort()方法调用之后一定会抛出异常,我对这个有点疑问。

    于是自己做了一个测试demo,来研究Abort抛出异常的时机。废话少说,直接上代码:

      static void Main(string[] args)
            {
                Thread th = new Thread(Worker);
                th.Start();
                Thread.Sleep(1000);
                try
                {
                    Console.WriteLine(th.ThreadState+","+th.IsAlive);
    
                    th.Abort();
                    Console.WriteLine(th.ThreadState);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message + ",");
                }
                th.Join();
                Console.WriteLine("子线程被正常终止,没有抛出异常");
                Console.WriteLine("主线程结束");
                Console.Read();
            }
           private static void Worker()
            {
                try
                {
                    for (int i = 0; i < 100; i++)
                    {
                        Console.WriteLine(i);
                        Thread.Sleep(100);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(e.GetType().Name);
                    Console.WriteLine("Abort抛出异常");
                }
                finally
                {
                    Console.WriteLine("{0} Status is:{1} In Abort Thread", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);
                }
            }

    上面这段代码,我在子线程的循环体中加入了Thread.Sleep()方法,以便让主线程能够在子线程执行完毕之前执行Abort方法,这个时候,调用Abort方法,子线程中会抛出异常。

    当我把Thread.sleep(100)这句话注释掉之后,会发现调用Abort方法之后,子线程中不会抛出异常。

    所以我们由此可以得出结论,当子线程中的方法执行完毕之后,调用Abort不会出现异常,当子线程中的方法执行完毕之前,调用Abort方法的时候会抛出异常。

    所以,我们在写多线程程序的时候,在Abort子线程时,一定要trycatch 捕获一下这个异常,以防程序出错。

  • 相关阅读:
    JavaScript快速入门-DOM对象
    JavaScript快速入门-ECMAScript对象介绍
    JavaScript快速入门-ECMAScript函数
    JavaScript快速入门-ECMAScript运算符
    [转] boost::function用法详解
    [转] [翻译]图解boost::bind
    [转] Git 分支
    [转] 多线程下变量-gcc原子操作 __sync_fetch_and_add等
    [转] Boost智能指针——scoped_ptr
    [转] linux下的c/c++调试器gdb
  • 原文地址:https://www.cnblogs.com/onsuccessway/p/3613087.html
Copyright © 2011-2022 走看看