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

时间:2014-04-26 22:48:42

标签: java multithreading java-8

有没有办法迫使Thread停在 Java 8 下,现在Thread.stop已被删除?这包括强制等待 lock / synchronized / sleep / wait / infinite 循环的线程停止。

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

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

4 个答案:

答案 0 :(得分:7)

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

  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:“有效的Java(第2版)”,第66项:同步对共享可变数据的访问

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

      

    考虑从另一个线程停止一个线程的任务。图书馆   提供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;
}
}