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

时间:2014-09-22 22:07:51

标签: java multithreading synchronization

Thread.stop()的Java Docs让你觉得如果你调用Thread.stop(),世界就会结束。

  

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

例如,如果我在第三方运行方法,关闭源库并且我需要保证它在5分钟或更短时间内结束,还有其他方法吗?使用Thread.stop()的现实后果是什么?如何判断它们是否发生?

1 个答案:

答案 0 :(得分:4)

从不!

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

如果您认为需要致电Thread.stop(),请不要!这将是错误的。

在任何情况下都不应该调用{p> Thread.stop()

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

我将这个答案捐赠给community wiki请 - 其他人 - 和我一起通过编辑这个答案并添加你的祈祷而不是致命的Thread.stop()来劝告那些异教徒因犯罪Thread.stop()而犯罪。 }。

如果你真的希望在5分钟后杀死一个进程 - 请使用Process destroyed。这将保护主JVM免受使用Thread.stop()终止线程时可能发生的任何潜在损坏。但是,如果子Process位于I / O中间,则可能会使文件处于损坏状态。防范这种情况的一种方法是使Process数据库的客户端可以回滚正在进行的事务。

一般来说,安全地终止某些不合作的是非常非常困难的。