我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗?
做到这一点的好方法是让run()一个线程保护一个Thread的boolean变量,并true在你要停止它的时候将其设置为外部变量,例如:
run()
boolean
true
`class MyThread extends Thread { volatile boolean finished = false;
public void stopMe() { finished = true; }
public void run() { while (!finished) { //do dirty work } } }`
曾有一种stop()方法存在,但正如文档所述
stop()
这种方法本质上是不安全的。使用Thread.stop停止线程会导致它解锁所有已锁定的监视器(由于未经检查的ThreadDeath异常会在堆栈中传播)。如果先前由这些监视器保护的任何对象处于不一致状态,则损坏的对象将变为其他线程可见,从而可能导致任意行为。
那就是为什么你应该有个警卫。