首页  >  文章  >  Java  >  如何在不使用 Thread.stop() 的情况下安全停止 Java 线程?

如何在不使用 Thread.stop() 的情况下安全停止 Java 线程?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-22 09:27:11768浏览

How to Safely Stop a Java Thread Without Using `Thread.stop()`?

如何在不使用已弃用的 Thread.stop() 方法的情况下有效地终止线程

Java Thread 类提供了 stop() 方法作为终止线程的方法,但它已被弃用,不应使用。本文介绍了一种使用中断方法终止线程的替代方法。

使用中断来停止线程

而不是直接调用 stop(),这是不安全的并且可能导致数据损坏,我们可以使用中断向线程发出信号,告知它应该正常终止。它的工作原理如下:

public class InterruptedExceptionExample {

    private static volatile boolean shutdown = false;

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while (!shutdown) {
                try {
                    System.out.println("Running...");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        thread.start();
        System.out.println("Press enter to quit");
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }

        shutdown = true;
        thread.interrupt();
    }
}

在此代码中:

  1. 我们创建一个在循环中无限期运行的线程,每 5 秒打印一次“Running...”。
  2. 我们有一个初始化为 false 的静态布尔标志(关闭),它将用于向线程发出信号stop.
  3. 线程的 run() 方法定期检查关闭标志。如果设置为 true,则线程退出循环。
  4. main() 方法创建线程,启动它,然后等待用户输入将关闭标志设置为 true。
  5. 最后,使用interrupt() 优雅地终止线程。

使用的优点中断:

与已弃用的 stop() 相比,中断线程有几个优点:

  • 优雅终止: 被中断的线程有机会清理在退出之前启动任何资源或执行任何必要的任务。
  • 异常抛出: 中断会导致某些方法(例如 sleep() 和 wait())抛出 InterruptedException 异常。编写良好的线程可以捕获这些异常来处理中断。
  • 安全稳健:与可能导致数据损坏的 stop() 不同,中断是一种更安全、更可靠的终止方式一个线程。

以上是如何在不使用 Thread.stop() 的情况下安全停止 Java 线程?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn