关于后端:面试突击-26如何正确停止线程

8次阅读

共计 2325 个字符,预计需要花费 6 分钟才能阅读完成。

在 Java 中进行线程的实现办法有以下 3 种:

  1. 自定义中断标识符,进行线程。
  2. 应用线程中断办法 interrupt 进行线程。
  3. 应用 stop 进行线程。

其中 stop 办法为 @Deprecated 润饰的过期办法 ,也就是不举荐应用的过期办法, 因为 stop 办法会间接进行线程,这样就没有给线程足够的工夫来解决进行前的保留工作,就会造成数据不残缺的问题,因而不倡议应用 。而 自定义中断标识也有一些问题,所以综合来看,interrupt 办法才是最现实的进行线程的办法,接下来咱们一起来看它们的具体差别。

1. 自定义中断标识符

自定义中断标识符就是在程序中定义一个变量来决定线程是否要中断执行,具体实现代码如下:

class FlagThread extends Thread {
    // 自定义中断标识符
    public volatile boolean isInterrupt = false;
    @Override
    public void run() {
        // 如果为 true -> 中断执行
        while (!isInterrupt) {// 业务逻辑解决}
    }
}

自定义中断标识符的问题在于:线程中断的不够及时。因为线程在执行过程中,无奈调用 while(!isInterrupt) 来判断线程是否为终止状态,它只能在下一轮运行时判断是否要终止以后线程,所以它中断线程不够及时,比方以下代码:

class InterruptFlag {
    // 自定义的中断标识符
    private static volatile boolean isInterrupt = false;

    public static void main(String[] args) throws InterruptedException {
        // 创立可中断的线程实例
        Thread thread = new Thread(() -> {while (!isInterrupt) { // 如果 isInterrupt=true 则进行线程
                System.out.println("thread 执行步骤 1:线程行将进入休眠状态");
                try {
                    // 休眠 1s
                    Thread.sleep(1000);
                } catch (InterruptedException e) {e.printStackTrace();
                }
                System.out.println("thread 执行步骤 2:线程执行了工作");
            }
        });
        thread.start(); // 启动线程

        // 休眠 100ms,期待 thread 线程运行起来
        Thread.sleep(100);
        System.out.println("主线程:试图终止线程 thread");
        // 批改中断标识符,中断线程
        isInterrupt = true;
    }
}

以上代码的执行后果如下图所示:

咱们冀望的是:线程执行了步骤 1 之后,收到中断线程的指令,而后就不要再执行步骤 2 了,但从上述执行后果能够看出,应用自定义中断标识符是没方法实现咱们预期的后果的,这就是自定义中断标识符,响应不够及时的问题。

2.interrupt 中断线程

应用 interrupt 办法能够给执行工作的线程,发送一个中断线程的指令,它并不间接中断线程,而是发送一个中断线程的信号,把是否正在中断线程的主动权交给代码编写者。相比于自定义中断标识符而然,它能更及时的接管到中断指令,如下代码所示:

public static void main(String[] args) throws InterruptedException {
    // 创立可中断的线程实例
    Thread thread = new Thread(() -> {while (!Thread.currentThread().isInterrupted()) {System.out.println("thread 执行步骤 1:线程行将进入休眠状态");
            try {
                // 休眠 1s
                Thread.sleep(1000);
            } catch (InterruptedException e) {System.out.println("thread 线程接管到中断指令,执行中断操作");
                // 中断以后线程的工作执行
                break;
            }
            System.out.println("thread 执行步骤 2:线程执行了工作");
        }
    });
    thread.start(); // 启动线程

    // 休眠 100ms,期待 thread 线程运行起来
    Thread.sleep(100);
    System.out.println("主线程:试图终止线程 thread");
    // 批改中断标识符,中断线程
    thread.interrupt();}

以上代码的执行后果如下图所示:

从上述后果能够看出,线程在接管到中断指令之后,立刻中断了线程,相比于上一种自定义中断标识符的办法来说,它能更及时的响应中断线程指令

3.stop 进行线程

stop 办法尽管能够进行线程,但它曾经是不倡议应用的废除办法了,这一点能够通过 Thread 类中的源码发现,stop 源码如下:

从下面的图片能够看出,stop 办法是被 @Deprecated 润饰的不倡议应用的过期办法,并且在正文的第一句话就阐明了 stop 办法为非平安的办法。在最新版本 Java 中,此办法曾经被间接移除了,所以强烈不倡议应用。

总结

本文介绍了进行线程的 3 种办法:

  1. 自定义中断标识符的进行办法,此办法的毛病是不能及时响应中断请求;
  2. 应用 interrupt 中断线程办法,此办法是发送一个中断信号给线程,它能够及时响应中断,也是最举荐应用的办法;
  3. 最初是 stop 办法,尽管它也能够进行线程,但此办法曾经是过期的不倡议应用的办法,在 Java 最新版本中曾经被间接移除了,所以不倡议应用。

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java 面试真题解析

面试合集:https://gitee.com/mydb/interview

正文完
 0