Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 1028|回复: 0

C# Thread.Abort方法与ThreadAbortException异常(取消线程与异常处理)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-3 02:50:40 | 显示全部楼层 |阅读模式

    1、Abort当前线程,后续程序不会执行

    class Program
    {
        public static Thread thread1;
    
        static void Main(string[] args)
        {
            thread1 = new Thread(Method1);
            thread1.Start();
            Console.ReadKey();
        }
        public static void Method1()
        {
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("Mthod1: " + i.ToString());
                    Thread.Sleep(1000);
                    if (i == 3)
                    {
                        Thread.CurrentThread.Abort();   // 抛出的ThreadAbortException异常
                    }
                    Console.WriteLine("Mthod1: " + i.ToString() + " End");
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine("Method1 SocketException: " + ex.ToString());
            }
            catch (ThreadAbortException ex)
            {
                // ThreadAbortException要在Exception的前面,因为Exception能够匹配所有异常
                Console.WriteLine("Method1 ThreadAbortException: " + ex.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine("Method1 Exception: " + ex.ToString());
            }
            finally
            {
                Console.WriteLine("Method1 Finally:");
            }
        }
    
    }

    执行结果:

    1、thread1.Abort()执行后会直接抛出ThreadAbortException异常。

    2、异常会停止后续所有程序的执行(没有输出"Method1: 3 End")。

    3、catch语句会执行。catch (Exception ex)和catch (ThreadAbortException ex)都可以捕获异常,由于Exception可以匹配所有异常,因此catch (ThreadAbortException ex)应该在catch (Exception ex)的前面使用,所以输出了“"Method1 ThreadAbortException”。

    4、finally语句会执行

    2、Abort当前线程,进行try catch捕获异常

    class Program
    {
        public static Thread thread1;
    
        static void Main(string[] args)
        {
            thread1 = new Thread(Method1);
            thread1.Start();
            Console.ReadKey();
        }
    
        public static void StopMethod1()
        {
            try
            {
                thread1.Abort();                 // 首先捕获抛出的ThreadAbortException异常
            }
            catch (Exception ex)
            {
                Console.WriteLine("StopMethod1: " + ex.ToString());
            }
        }
        public static void Method1()
        {
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("Mthod1: " + i.ToString());
                    Thread.Sleep(1000);
                    if (i == 5) StopMethod1();  // 再次捕获抛出的ThreadAbortException异常
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Method1: " + ex.ToString()); 
            }
        }        
    }

    运行结果:

    try catch{} 捕获两次抛出的ThreadAbortException。

    2、Abort当前线程,不进行try catch捕获异常

    class Program
    {
        public static Thread thread1;
    
        static void Main(string[] args)
        {
            thread1 = new Thread(Method1);
            thread1.Start();
            Console.ReadKey();
        }
    
        public static void StopMethod1()
        {
            thread1.Abort();
        }
        public static void Method1()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Mthod1: " + i.ToString());
                Thread.Sleep(1000);
                if (i == 5) StopMethod1();
            }
        }
    }

    运行结果:

    1、虽然线程抛出了ThreadAbortException异常,由于线程中没有使用try catch的语句捕获异常,所以看上去线程很平静的退出了。

    2、而且,由于是在线程中抛出的异常,所以主进程没有任何错误提示。

    3、for循环只输出到5,Abort()后一般线程会直接停止。

    3、在一个线程中Abort另一个线程

    class Program
    {
        public static Thread thread1;
        public static Thread thread2;
    
        static void Main(string[] args)
        {
            thread1 = new Thread(Method1);
            thread2 = new Thread(Method2);
            thread1.Start();
            thread2.Start();
            Console.ReadKey();
        }
    
        public static void StopMethod1()
        {
            try
            {
                thread2.Abort();
            }
            catch (Exception ex)
            {
                Console.WriteLine("StopMethod1: " + ex.ToString());
            }
        }
        public static void Method1()
        {
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("Method1: " + i.ToString());
                    Thread.Sleep(1000);
                    if (i == 5) StopMethod1();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Method3: " + ex.ToString());
            }
        }
        public static void Method2()
        {
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("Method2: " + i.ToString());
                    Thread.Sleep(1000);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Method2: " + ex.ToString());
            }
        }
    }

    运行结果:

    1、可以看到只在thread2中捕获到了ThreadAbortException异常。

    2、thread1完整的运行完毕了,并且没有ThreadAbortException异常抛出。

    总结

    1、theadX.Abort()方法会在线程X中抛出ThreadAbortException异常,线程X中所有正在执行的try catch都会捕获该异常。

    2、theadX.Abort()有可能在Y线程中调用的,不会在Y线程中抛出ThreadAbortException异常。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 21:06 , Processed in 0.063457 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表