替代 Java 8 中的 Thread.stop()?

2022-09-01 21:13:40

有没有办法强制a在Java 8下停止,现在已经删除了?这包括强制等待锁定/同步/睡眠/等待/无限循环的线程停止。ThreadThread.stop

这是作为应用程序的监视程序的一部分,它可以检测它是否具有死锁/冻结,强制终止线程,然后保存当前状态以避免丢失信息 - 虽然由于强制线程停止而导致此信息损坏的可能性很高,但最好是拥有可能不正确的信息的副本而不是丢失它。

尝试在不停止锁定线程的情况下保存此信息是不可能的,因为保存它需要获取锁。


答案 1

阅读这些文章,他们解释了这一点:

  1. “为什么Thread.stop,Thread.suspend,Thread.resume和Runner.runFinalizersOnExit已弃用?”http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

  2. Joshua Bloch:“Effective Java (2nd Edition)”,第66项:同步对共享可变数据的访问

Joshua Bloch解释了如何停止线程,并说:

考虑从一个线程停止另一个线程的任务。这些库提供了 Thread.stop 方法,但此方法很久以前就被弃用了,因为它本质上是不安全的 — 使用它可能会导致数据损坏。不要使用 Thread.stop。从另一个线程停止一个线程的推荐方法是让第一个线程轮询一个布尔字段,该字段最初为 false,但第二个线程可以设置为 true,以指示第一个线程将自行停止。

使用此技术时,还应处理布尔字段的同步。我不想从Joshua Bloch的书中复制太多的东西,但你会在那里和上面提到的官方Oracle Java文档中找到所有内容。


答案 2

如果你真的需要停止一种困难的方式,你可能会认为方法Thread.stop()(不提供任意)仍然适用于Java 8。它会在停止的线程上生成一个 ThreadDeath,尽管它的名字不寻常,但它可以像其他线程一样处理。唯一的区别是,如果未捕获,则不会打印堆栈跟踪。ThreadThrowableErrorThreadDeath


但请注意,此方法被弃用的原因与其他方法相同。它可能会在Java的下一个版本中变得未移植。所以现在还是时候考虑一个B计划了...stop