有没有办法迫使Thread
停在 Java 8 下,现在Thread.stop
已被删除?这包括强制等待 lock / synchronized / sleep / wait / infinite 循环的线程停止。
这是应用程序的 watchdog 的一部分,它可以检测它是否具有死锁/冻结,强制终止线程然后保存当前状态以避免丢失信息 - 虽然由于强制线程停止而导致此信息被破坏的可能性很高,但是获得可能不正确的信息的副本比丢失信息更好。
尝试在不停止锁定线程的情况下保存此信息是不可能的,因为保存它将需要获取锁。
答案 0 :(得分:7)
阅读这些文章,他们会解释:
“为什么Thread.stop,Thread.suspend,Thread.resume和Runtime.runFinalizersOnExit已弃用?” http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
Joshua Bloch:“有效的Java(第2版)”,第66项:同步对共享可变数据的访问
约书亚布洛赫解释了如何阻止一个线程说:
考虑从另一个线程停止一个线程的任务。图书馆 提供Thread.stop方法,但是这个方法已经过时了 以前,因为它本质上是不安全的 - 它的使用会导致数据 腐败。不要使用Thread.stop。建议的方法来阻止一个 来自另一个的线程是让第一个线程轮询一个布尔字段 这最初是假的,但可以通过第二个线程设置为true 表示第一个线程要自行停止。
使用此技术时,您还应处理布尔字段的同步。我不想从Joshua Bloch的书中复制太多东西,但是你会在那里和上面提到的官方Oracle Java文档中找到所有内容。
答案 1 :(得分:6)
如果你确实需要以艰难的方式停止Thread
,你可能会认为方法Thread.stop()
(不提供任意Throwable
)仍适用于Java 8.它将生成一个停止线程上的ThreadDeath
,可以像任何其他Error
一样处理,尽管名称不同寻常。唯一的区别是,如果未捕获ThreadDeath
,则不会打印堆栈跟踪。
但请注意,由于大多数原因与其他stop
方法相同,因此不推荐使用此方法。它可能在下一个Java版本中不受支持。所以现在还是时候考虑一个计划B ......
答案 2 :(得分:1)
停止线程的正确方法是在其上调用interrupt
。
答案 3 :(得分:0)
第 1 步:
yourThreadObj.interrupt()
第 2 步:覆盖线程类中的 interrupt() 方法并通过此布尔值停止操作
public class SampleLooperThread extends Thread{
private boolean isInterrupted= false;
@Override
public void run() {
if(isInterrupted){
// stop your blocks
}
//your blocks of code
}
@Override
public void interrupt() {
super.interrupt();
isInterrupted = true;
}
}