什么时候可以在 Java 中使用 Thead.stop()?

bra*_*ido 2 java multithreading synchronization

Thread.stop() 的 Java Docs 听起来好像如果你曾经调用 Thread.stop() 世界就会结束。

已弃用. 这种方法本质上是不安全的。使用 Thread.stop 停止线程会使其解锁所有已锁定的监视器(这是未经检查的 ThreadDeath 异常向上传播堆栈的自然结果)。如果先前受这些监视器保护的任何对象处于不一致状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。stop 的许多用途应该被替换为简单地修改一些变量以指示目标线程应该停止运行的代码。目标线程应该定期检查这个变量,如果变量表明它要停止运行,则以有序的方式从它的 run 方法返回。如果目标线程等待很长时间(例如,在条件变量上),应该使用interrupt方法来中断等待。有关更多信息,请参阅为什么不推荐使用 Thread.stop、Thread.suspend 和 Thread.resume?。

例如,如果我在 3rd 方的封闭源代码库中运行一个方法,并且我需要保证它在 5 分钟或更短的时间内结束,还有其他方法吗?使用 Thread.stop() 的实际后果是什么,我如何确定它们是否发生?

Old*_*eon 5

绝不!

在任何情况下都不应使用Thread.stop().

如果你认为你需要打电话Thread.stop()不要!会出错。

Thread.stop() 在任何情况下都不应该被调用。

请不要打电话Thread.stop()- 即使您受到死亡威胁。

我捐赠这个答案是为了community wiki取悦其他人 - 和我一起Thread.stop()通过编辑这个答案并添加你的祈祷来告诫那些异教徒犯下召唤罪Thread.stop()

如果您真的希望一个进程在 5 分钟后被杀死 - 使用一个可以被销毁进程。这将保护主 JVM 免受在使用. 但是,如果子进程处于 I/O 中间,这可能会使文件处于损坏状态。防御这种情况的一种方法是使数据库的客户端可以回滚进行中的事务。Thread.stop()ProcessProcess

在一般情况下,终止不合作的东西安全是非常非常困难的。

  • 困难,但并非不可能。操作系统(例如 Z/OS)可以做到这一点。诸如 CICS 之类的事务监视器会这样做。DBMS 系统(例如 DB/2)就是这样做的。在所有情况下,因为这些系统的管理员需要杀死失控进程的功能。 (2认同)