这是一个危险的想法。Javadoc的
Thread.stop()解释如下:
这种方法本质上是不安全的。使用Thread.stop停止线程会导致它解锁所有已锁定的监视器(由于未经检查的ThreadDeath异常会自然传播堆栈)。如果先前由这些监视器保护的任何对象处于不一致状态,则损坏的对象将变为其他线程可见,从而可能导致任意行为。stop的许多用法应由仅修改某些变量以指示目标线程应停止运行的代码代替。目标线程应定期检查此变量,如果该变量指示要停止运行,则应有序地从其运行方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法来中断等待。
从根本上讲,需要构建和设计线程以安全终止,因此无法安全地终止任意线程。一个相当标准的模式是这样实现的:
public abstract class StoppableRunnable implements Runnable { private volatile boolean stopWork; private boolean done; public final void run() { setup(); while(!stopWork && !done) { doUnitOfWork(); } cleanup(); } public void stop() { stopWork = true; } protected void done() { done = true; } protected void setup() { } protected void cleanup() { } protected abstract void doUnitOfWork();}您暗示您不是这些线程的作者,这表明它们可能无法安全地停止。在这种情况下,您可以调用
Thread.interrupt()以指示线程停止其正在执行的操作(而不是上述模式,您可以使用
Thread.interrupt()以达到类似的效果),但是类似地,如果线程的设计者没有编写它来处理中断,则可能不做任何事情或导致状态不一致或其他错误。
最终,
Thread.stop()如果您只是想“
[强制]线程停止执行”而又不能修改线程的实现,那将是您想要的。但是,就像
kill在Unix中使用一样,这是一个危险的提议,因此您应该以这种方式终止线程后,从根本上考虑JVM处于不稳定且不可修复的状态,然后尝试尽快退出该程序。
关于中断然后停止的建议:
这里仍然存在很多问题,特别是中断并不能保证线程会立即中断(它的工作方式与
StoppableRunnable上面的类似,尽管不太明确),而是设置了一个标志,指出线程应尽可能地中断。这意味着您可以调用
Thread.interrupt(),线程可以启动其正确的中断处理行为,然后中途进行调用,
Thread.stop()引发火灾,猛烈杀死线程并可能破坏JVM。调用
Thread.interrupt()不保证线程何时或如何响应该中断,这就是为什么我更喜欢中的显式行为
StoppableRunnable。不用说,如果您要打电话
Thread.stop(),先打电话几乎无济于事
Thread.interrupt()。我不建议这样做,但您最好还是打电话
Thread.stop()
首先。
此外,认识到运行循环的代码 本身就是线程中的 -这意味着循环很可能会先杀死自己,而使所有其他线程都运行。



