一尘不染

如何优雅地停止Java线程?

java

我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗?


阅读 585

收藏
2020-03-05

共1个答案

一尘不染

做到这一点的好方法是让run()一个线程保护一个Thread的boolean变量,并true在你要停止它的时候将其设置为外部变量,例如:

`class MyThread extends Thread
{
volatile boolean finished = false;

public void stopMe()
{
finished = true;
}

public void run()
{
while (!finished)
{
//do dirty work
}
}
}`

曾有一种stop()方法存在,但正如文档所述

这种方法本质上是不安全的。使用Thread.stop停止线程会导致它解锁所有已锁定的监视器(由于未经检查的ThreadDeath异常会在堆栈中传播)。如果先前由这些监视器保护的任何对象处于不一致状态,则损坏的对象将变为其他线程可见,从而可能导致任意行为。

那就是为什么你应该有个警卫。

2020-03-05