zoukankan      html  css  js  c++  java
  • c# Thread——1.为什么Abort中断线程是不可靠的

    Thread.Abort 方法在c#中用作强制中断线程的执行,大多用于线程内部满足某个特定条件而自己调用关闭自身,比如下面的代码在i自增到3的时候就会停止打印。

    class Program
        {
            static void Main(string[] args)
            {
                Thread thread = new Thread(ShowMessage);
                thread.Start();
                Console.Read();
            }
            public static void ShowMessage()
            {
                int i = 0;
                while (true)
                {
                    if (i == 3)
                        Thread.CurrentThread.Abort();
                    Console.WriteLine("hello");
                    Thread.Sleep(1000);
                    i++;
                }
            }
        }

    结果如下:

     看样子是起作用了,但是原理我们可以看看Abort方法的介绍

     看到这里我相信很多小伙伴们都知道了,其实Abort方法就是给目标线程强制注入了一个异常,导致该线程抛出一个ThreadAbortException的的异常,而中断该线程

    那么相应的为什么说Abort不安全,其实也能够讲得通了,我们可以在子线程中捕获异常,并且调用恢复线程的方法,则Abort失效。

    代码如下所示:

     class Program
        {
            static void Main(string[] args)
            {
                Thread thread = new Thread(ShowMessage);
                thread.Start();
                Console.Read();
            }
            public static void ShowMessage()
            {
                int i = 0;
                while (true)
                {
                    try
                    {
                        if (i == 3)
                            Thread.CurrentThread.Abort();
                    }
                    catch (ThreadAbortException ex)
                    {
                        Console.WriteLine("休想停掉我!!!");
                        Thread.ResetAbort();//恢复线程
                    }
                    Console.WriteLine("hello");
                    Thread.Sleep(1000);
                    i++;
                }
            }
        }

    看看效果:

     此时的Abort就没有任何作用了。

  • 相关阅读:
    Flink延时监控
    FLink全链路时延—测量方式
    Linux搭建SFTP服务器
    Red Hat:USING AMQ STREAMS WITH MIRRORMAKER 2.0
    idea 搭建运行kafka 源码
    Kafka Connect Concepts
    Java IPv6相关属性preferIPv4Stack、preferIPv6Addresses介绍
    如何确定Flink反压的根源?How to identify the source of backpressure?
    如何成为 Apache 项目的 Committer
    Apache Kafka KIP 介绍
  • 原文地址:https://www.cnblogs.com/qwqwQAQ/p/11909436.html
Copyright © 2011-2022 走看看