gpt4 book ai didi

java - 真的没有办法强制杀死Java中的线程吗?

转载 作者:行者123 更新时间:2023-12-03 19:42:09 25 4
gpt4 key购买 nike

简介:

由于不推荐使用Thread.stop()(据我所知),stop的唯一方法是中断该线程。

Javadoc说,中断Thread意味着the thread's interrupt status will be set

但这是否意味着忽略中断标志的线程永远不会终止?我猜在大多数情况下,应用程序开发人员也在开发Runnable,该Runnable在Thread中执行。因此,忽略中断标志基本上是他自己的错,对此我完全满意。

但是:

边缘盒呢?那么使用自定义插件机制的应用程序呢?
也许您想加载一个jar并在新创建的线程中运行。然后,应用程序本身失去了管理线程的所有功能。这完全取决于插件开发人员的信誉,即他或她提供了某种停止代码的方法(使用Reflection API和自定义注释或其他方法)。

我还想到其他示例,可能有必要杀死线程。

我的结论

我完全知道为什么使用Thread.stop杀死线程不是最好的主意。但是我有点困惑,为什么应该完全删除此选项。我还查看了并发API的内部内容,也没有找到等效的停止方式。

请分享您对此的想法。

最佳答案

Is there really no way to forcefully kill a Thread in Java?



确实没有办法 安全来强制杀死Java中的单个线程。

自Java 1.2起,就不推荐使用 Thread.stop(),因为它本质上是不安全的。

实际上已经删除了一些相关方法,但是 countFrames()pause()resume()stop()仍然存在。

如果有一种 安全的方法来停止不合作的线程,那将非常好,但是Java设计人员很久以前就意识到 Thread.stop:
  • 可能使对象处于不确定状态,而
  • 可能使其他线程等待通知和条件变量更改,这些更改将永远不会发生。

  • 这意味着停止线程可能导致应用程序的其余部分行为异常。此外,设计从停止线程中恢复的应用程序(通常)是不切实际的。

    不幸的是,在Java线程模型的范围内,确实没有解决方案。

    (您将需要一个替代模型,其中线程只能通过传递消息进行通信,并且不能共享可变状态。然后,您可以对应用程序进行编码,使其在线程停止或崩溃时具有弹性。但是,此更改将需要重写现有的Java代码中的绝大部分。1998年是不可能的。现在,可能性甚至更低。)

    有关弃用原因的更多详细信息,请阅读 javadocJava Thread primitive deprecation技术说明。

    But doesn't that mean, that a Thread that is ignoring the interrupt flag will never terminate?



    正确1。那是一个错误,或者:

    代码中不注意该标志的
  • 应用程序中的
  • ,它允许运行不可信的插件代码(忽略该标志)。

  • 1-但并不完全正确。如果线程拒绝死亡,该应用程序也可以调用 System.exit,或者它可以依赖于外部监视器或人为干预: ^Ckill -9。这是您在实践中如何处理该问题的方法。

    I am also aware about that article. As I said, I know about the problems of Thread.stop(). Just because it is a bad way to do it and could result in side effects isn't a reason to forbid it completely.



    这不是完全禁止的。不推荐使用。

    将其视为非常有力的建议。

    关于java - 真的没有办法强制杀死Java中的线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58642987/

    25 4 0
    文章推荐: delphi - 如何在 Windows 7 系统菜单的 "Open with..."部分添加应用程序?
    文章推荐: iphone - 如何使用 TouchXML 或其他库解析 iPhone 上的 HTML?
    文章推荐: iPhone - webViewDidFinishLoad 未调用
    文章推荐: Java react 器-链Mono 与另一个产生Mono 的异步任务