有时我们必须在完全关闭整个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的情况下停止一个线程?
答案 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。