Thread.stop() - 已弃用

新手上路,请多包涵

为什么 Thread.stop() 在 Java 中被弃用?在他们的网站上,我看到以下内容:

为什么不推荐使用 Thread.stop

因为它本质上是不安全的。停止线程会导致它解锁所有已锁定的监视器。 (当 ThreadDeath 异常向上传播到堆栈时,监视器被解锁。)如果以前受这些监视器保护的任何对象处于不一致状态,其他线程现在可能会以不一致状态查看这些对象。据说这样的物体被损坏了。当线程对损坏的对象进行操作时,可能会导致任意行为。这种行为可能很微妙且难以察觉,也可能很明显。与其他未经检查的异常不同, ThreadDeath 静静地杀死线程;因此,用户不会收到有关他的程序可能已损坏的警告。损坏可能在实际损坏发生后的任何时间出现,甚至在未来数小时或数天之后。

我不明白他们所说的“监视器”是什么意思。无论如何,我的问题是如果不应该调用 Thread.stop() 那么应该如何停止 Java 线程?

原文由 user2374107 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 589
2 个回答

您问:

我的问题是,如果没有办法在 Java 中停止线程,那么如何停止线程?

答案:在 Java 中,没有干净、快速或可靠的方法来停止线程。

线程终止不是那么简单。一个正在运行的线程,通常被许多作者称为轻量级进程,它有自己的堆栈并且是自己命运的主人(守护进程也是如此)。它可能拥有文件和套接字。它可能持有锁。突然终止并不总是那么容易:如果线程正在写入文件并在完成写入之前被杀死,则可能会出现不可预测的后果。或者当它被击中头部时,线程持有的监视器锁又如何呢?

相反,线程依赖于一种称为 中断协作 机制。这意味着 Threads 只能向其他线程发出停止 _信号_,而不是强制它们停止。

要在 Java 中停止线程,我们依赖于一种称为中断的合作机制。这个概念很简单。要停止一个线程,我们所能做的就是向它发送一个信号,也就是中断它,请求线程在下一个可用的机会停止自己。就这样。没有人知道接收线程可能会对信号做什么:它甚至可能懒得去检查信号;甚至更糟的是忽略它。

来源: https ://codeahoy.com/java/How-To-Stop-Threads-Safely/

原文由 goblinjuice 发布,翻译遵循 CC BY-SA 4.0 许可协议

当您的线程正确处理中断时,应该可以使用 ExecutorService 接口立即终止它。根据 Oracle 文档, ExecutorService.shutdownNow() 方法,尝试停止所有正在执行的任务而不等待它们终止。然而,除了尽最大努力阻止它们之外,没有任何保证。这是一些示例代码:

 class MyThread implements Runnable{
    @Override
    public void run() {
        for (int i = 1; i < 10000000; i++)
            try {
            System.out.println(i + " ThreadID: " + Thread.currentThread().getId());
            if (Thread.interrupted())
                    throw new InterruptedException();
            } catch (InterruptedException e) {
                return;
        }
    }
}

ExecutorService executor = Executors.newFixedThreadPool(3);
            executor.submit(new MyThread());
            executor.submit(new MyThread());
            executor.submit(new MyThread());
            executor.shutdownNow();

在没有终止的情况下,每个线程应该将消息打印到控制台 10000000 次。 executor.shutdownNow() 方法立即停止所有三个线程。

原文由 Tinki 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题