如何无条件地停止一个线程

时间:2013-06-22 14:07:58

标签: java

有时我们必须在完全关闭整个JVM之前强行停止线程作为最佳工作。通常Thread#stop被引用作为一种万无一失,即使是火腿和弃用,也无条件地停止线程。但事实并非如此:所有流氓线程必须做的就是保持自己运行的是catch ThreadDeath或超类:

public static void main(String[] args) throws InterruptedException {
  final Thread t = new Thread() { public void run() {
    for (;;)
      try { Thread.sleep(Long.MAX_VALUE); }
      catch (Throwable t) {
        System.out.println(t.getClass().getSimpleName() + ". Still going on...");
      }
  }};
  t.start();
  Thread.sleep(200);
  t.interrupt();
  Thread.sleep(200);
  t.interrupt();
  Thread.sleep(200);
  t.stop();
  Thread.sleep(200);
  t.stop();
}

这将打印

InterruptedException. Still going on...
InterruptedException. Still going on...
ThreadDeath. Still going on...
ThreadDeath. Still going on...

我还能做些什么吗,真的在不杀死整个JVM的情况下停止一个线程?

2 个答案:

答案 0 :(得分:5)

没有。没有内置的简单方法来真正停止一个线程。

这样的方法,破坏,was planned but not implemented

  

不推荐使用。此方法最初设计用于在不进行任何清理的情况下销毁此线程。它持有的任何监视器都将保持锁定状态。但是,该方法从未实施过。如果要实现,那么就会以suspend()的方式处于死锁状态。如果目标线程在销毁时保留了一个保护关键系统资源的锁,那么任何线程都无法再次访问该资源。如果另一个线程试图锁定此资源,则会导致死锁。这种死锁通常表现为“冻结”过程。

线程不是为了那个。他们不提供安全保障。另一个线程也可以终止JVM本身 - 或者产生其他有问题的线程。

有关详细信息,不推荐使用see Why are Thread.stop, Thread.suspend and Thread.resume。你可以read why here.

答案 1 :(得分:0)

无法保证该线程可以在Java中停止。最有力的方法是Thread.stop,但这是一个等待发生的事故。替代方法是使用Thread.interrupt并让线程检查一个标志,但这两个都依赖于正确编码的线程,并且在标志的情况下,定期检查它。

就个人而言,我会确保我没有捕获ThreadDeath。停止是一种阻止线程的糟糕方法,但至少你应该收到通知,只要你没有捕获ThreadDeath。