这是一个危险的想法。Thread.stop()
的 Javadoc 解释道:
此方法本质上是不安全的。使用 Thread.stop 停止线程会导致它解锁所有已锁定的监视器(这是未经检查的 ThreadDeath 异常向上传播堆栈的自然结果)。如果以前受这些监视器保护的任何对象处于不一致状态,则损坏的对象对其他线程可见,这可能会导致任意行为。stop 的许多用法应该替换为代码,这些代码只是修改某些变量以指示目标线程应停止运行。目标线程应定期检查此变量,如果该变量指示它要停止运行,则以有序的方式从其 run 方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法来中断等待。
从根本上说,线程需要构建和设计为安全终止,不可能安全地杀死任意线程。一个相当标准的模式是这样实现的:
public abstract class StoppableRunnable implements Runnable {
private volatile boolean stopWork;
private boolean done;
public final void run() {
setup();
while(!stopWork && !done) {
doUnitOfWork();
}
cleanup();
}
/**
* Safely instructs this thread to stop working,
* letting it finish it's current unit of work,
* then doing any necessary cleanup and terminating
* the thread. Notice that this does not guarentee
* the thread will stop, as doUnitOfWork() could
* block if not properly implemented.
*/
public void stop() {
stopWork = true;
}
protected void done() {
done = true;
}
protected void setup() { }
protected void cleanup() { }
/**
* Does as small a unit of work as can be defined
* for this thread. Once there is no more work to
* be done, done() should be called.
*/
protected abstract void doUnitOfWork();
}
您暗示您不是这些线程的作者,这表明它们可能无法安全停止。在这种情况下,您可以调用 Thread.interrupt()
来指示线程停止它正在做的事情(而不是上面描述的模式,您可以使用类似的效果),但是类似地,如果线程的设计器尚未编写它来处理中断,则可能不会执行任何操作或导致不一致的状态或其他错误。Thread.interrupt()
最终,如果您只想“[强制]线程停止执行”并且无法修改线程的实现,则是您想要的;然而,就像在Unix中使用一样,这是一个危险的命题,在以这种方式终止线程后,你基本上应该认为你的JVM处于不稳定和不可挽回的状态,并尝试尽快退出程序。Thread.stop()
kill
关于您中断然后停止的建议:
这里仍然有很多问题,特别是,中断并不能保证线程会立即中断(它的工作方式与我上面的类似,尽管不那么明确),而是设置一个标志,线程应该在可能的情况下中断。这意味着你可以调用 ,线程可以启动它正确的中断处理行为,然后在中途,你对触发的调用,暴力杀死线程并可能破坏你的JVM。调用以不保证线程何时或如何响应该中断,这就是为什么我更喜欢 中的显式行为。毋庸置疑,如果您要打电话,那么先打电话几乎没有什么好处。我不推荐它,但你不妨先打电话。StoppableRunnable
Thread.interrupt()
Thread.stop()
Thread.interrupt()
StoppableRunnable
Thread.stop()
Thread.interrupt()
Thread.stop()
此外,要认识到运行循环的代码本身位于线程中 - 这意味着您的循环很可能首先杀死自身,而使所有其他线程保持运行状态。