在Java 8中交替使用Thread.stop()?

Lun*_*una 20 java multithreading java-8

有没有办法强制ThreadJava 8下停止,现在Thread.stop已被删除?这包括强制等待锁/同步/睡眠/等待/无限循环的线程停止.

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

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

Hon*_*dek 8

阅读这些文章,他们解释说:

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

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

约书亚布洛赫解释了如何阻止一个线程,并说:

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

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


Hol*_*ger 8

如果你真的需要以一种Thread艰难的方式停止,你可能会认为该方法Thread.stop()(不提供任意Throwable)仍然适用于Java 8.它将ThreadDeath在已停止的线程上生成一个可以像任何其他方式一样处理的线程Error,尽管它的名称不同寻常.唯一的区别是如果ThreadDeath没有捕获,将不会打印堆栈跟踪.


但请注意,由于大多数原因与其他stop方法相同,因此不推荐使用此方法.它可能在下一个Java版本中不受支持.所以现在还是时候考虑一​​个计划B ......