首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何优雅地停止java线程?

如何优雅地停止java线程?
EN

Stack Overflow用户
提问于 2010-07-07 20:16:20
回答 5查看 70.7K关注 0票数 68

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

EN

回答 5

Stack Overflow用户

发布于 2010-07-07 23:06:24

使用标志停止线程的不好的部分是,如果线程正在等待或休眠,那么您必须等待它完成等待/休眠。如果在线程上调用interrupt方法,则会导致等待或睡眠调用以InterruptedException退出。

(关于标志方法的第二个缺点是,大多数重要的代码将利用像java.util.concurrent这样的库,其中的类被专门设计为使用中断来取消。尝试在传递给Executor的任务中使用手卷标志将会很笨拙。)

调用interrupt()还会设置一个interrupted属性,您可以将其用作检查是否退出的标志(在线程没有等待或休眠的情况下)。

您可以编写线程的run方法,以便在线程正在执行的任何循环逻辑之外捕获InterruptedException,也可以在循环内捕获异常并接近抛出异常的调用,从而在InterruptedException的catch块内设置中断标志,这样线程就不会忘记它被中断的事实。被中断的线程仍然可以保持控制,并按照自己的条件完成处理。

假设我想要编写一个以增量方式工作的工作线程,其中由于某种原因在中间有一个休眠,我不想退出休眠以使处理退出而不执行该增量的剩余工作,我只希望它在增量期间退出:

代码语言:javascript
复制
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.

票数 15
EN

Stack Overflow用户

发布于 2010-07-07 20:23:01

您不应该从另一个线程中删除线程。这被认为是相当坏的习惯。然而,有很多方法。您可以在线程的run方法中使用return语句。或者你可以检查线程是否已经被中断,然后它会取消它的工作。F.e.:

代码语言:javascript
复制
while (!isInterrupted()) { 
  // doStuff
}
票数 10
EN

Stack Overflow用户

发布于 2010-07-07 20:18:54

在某个地方创建一个易失性布尔stop。然后,在线程中运行的代码中,定期执行

代码语言:javascript
复制
 if (stop) // end gracefully by breaking out of loop or whatever

要停止线程,请将stop设置为true

我想你必须用这种方式手动完成。毕竟,只有在线程中运行的代码才知道什么是优雅的,什么是不优雅的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3194545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档