我写了一个线程,它花了太多的时间来执行,似乎它还没有完全完成。我想优雅地停止线程。有什么帮助吗?
发布于 2010-07-07 23:06:24
使用标志停止线程的不好的部分是,如果线程正在等待或休眠,那么您必须等待它完成等待/休眠。如果在线程上调用interrupt方法,则会导致等待或睡眠调用以InterruptedException退出。
(关于标志方法的第二个缺点是,大多数重要的代码将利用像java.util.concurrent这样的库,其中的类被专门设计为使用中断来取消。尝试在传递给Executor的任务中使用手卷标志将会很笨拙。)
调用interrupt()还会设置一个interrupted属性,您可以将其用作检查是否退出的标志(在线程没有等待或休眠的情况下)。
您可以编写线程的run方法,以便在线程正在执行的任何循环逻辑之外捕获InterruptedException,也可以在循环内捕获异常并接近抛出异常的调用,从而在InterruptedException的catch块内设置中断标志,这样线程就不会忘记它被中断的事实。被中断的线程仍然可以保持控制,并按照自己的条件完成处理。
假设我想要编写一个以增量方式工作的工作线程,其中由于某种原因在中间有一个休眠,我不想退出休眠以使处理退出而不执行该增量的剩余工作,我只希望它在增量期间退出:
class MyThread extends Thread
{
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
doFirstPartOfIncrement();
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
// restore interrupt flag
Thread.currentThread().interrupt();
}
doSecondPartOfIncrement();
}
}
}
Here is an answer to a similar question, including example code.
发布于 2010-07-07 20:23:01
您不应该从另一个线程中删除线程。这被认为是相当坏的习惯。然而,有很多方法。您可以在线程的run
方法中使用return
语句。或者你可以检查线程是否已经被中断,然后它会取消它的工作。F.e.:
while (!isInterrupted()) {
// doStuff
}
发布于 2010-07-07 20:18:54
在某个地方创建一个易失性布尔stop
。然后,在线程中运行的代码中,定期执行
if (stop) // end gracefully by breaking out of loop or whatever
要停止线程,请将stop
设置为true
。
我想你必须用这种方式手动完成。毕竟,只有在线程中运行的代码才知道什么是优雅的,什么是不优雅的。
https://stackoverflow.com/questions/3194545
复制相似问题