这不是关于如何干净地终止一个线程的问题,即通过调用它的中断并让线程适当地响应。我无法以任何方式修改线程正在执行的代码。
我特别想立即终止一个Thread,我根本不关心什么状态。我知道使用Thread.stop可能有类似的东西,但这实际上会引发一个ThreadDeath异常,并且对于无法捕获线程来终止此异常。但是,我正在处理的代码捕获了这个异常并且没有重新抛出它。
Thread.destroy()似乎是我正在寻找的,但是这个方法从未实现过。有没有其他方法可以实现这个目标?
答案 0 :(得分:4)
我相信在Java中没有办法像你所描述的那样杀死一个线程。正如您在评论中指出的那样,interrupt
将无法满足您的需求。如果线程正在执行,它只是设置一个标志,并由线程注意它。如果线程正在等待或正在休眠,它将抛出InterruptedException
。
我能想象你正在描述的唯一方法就是杀死线程运行的进程。 (例如,致电System.exit(int)
。)
答案 1 :(得分:2)
没有办法。来自Java Concurrency in Practice
:
由于没有先发制人的方式来阻止线程,所以必须改为 被说服自己关闭。
如你所说,中断线程不是更干净的方式。干净的方式可能是:
您并不打算向threads
提交需要很长时间才能完成的任务。您宁愿将它们分成较小的任务并发送poison pill
来取消更大的任务。如果没有办法做到这一点,那么spawn/fork
一个process
如果你想取消任务就杀掉它。
答案 2 :(得分:1)
如果你不相信有问题的线程需要杀死它,你可能最好在一个单独的进程中运行它,然后杀掉进程。
无论如何,如果你对弃用的Thread
方法没问题,下面的代码可能会有效:
while (theThread.isAlive()) {
theThread.stop();
}
取决于线程试图生存的严重程度......
如果这还不够,您可能希望在多个线程中运行此代码或重复stop()
调用。但是,我设法使用以下代码终止以下线程:
final Thread iWontDie = new Thread(() -> {
int i = 0;
while (true) {
try {
System.out.println("I'm still alive! " + ++i);
} catch (Throwable t) {
// eat t
}
}
});
iWontDie.start();
答案 3 :(得分:0)
如果您使用的是Java 7或更早版本,则可以使用重载的stop(Throwable obj)方法抛出除ThreadDeath
错误之外的其他内容:
强制线程停止执行。如果参数
obj
为null
,则抛出NullPointerException
(在当前线程中)。该线程表示的线程被强制停止异常处理,并将Throwable
对象obj
作为异常抛出。这是一个不寻常的行动;通常,应该使用不带参数的stop方法。
此方法与无参数版本一样,已弃用,因此请记住这一点。