为了账号安全,请及时绑定邮箱和手机立即绑定

请问如何优雅地停止java线程?

请问如何优雅地停止java线程?

牧羊人nacy 2019-11-05 09:04:22
如何优雅地停止java线程?我写了一个线程,它需要太多的时间来执行,而且它似乎还没有完全完成。我想优雅地阻止这条线。有什么帮助吗?
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

使用标志停止线程的坏处在于,如果线程正在等待或处于休眠状态,则必须等待它完成等待/休眠。如果您调用线程上的中断方法,那么这将导致等待或睡眠调用与InterruptedException一起退出。

(标志方法的第二个缺点是,大多数非平凡的代码都将使用java.util.current这样的库,其中的类是专门设计用来使用中断来取消的。在传递给Executir的任务中使用手摇标志将很尴尬。)

调用中断()还设置一个中断属性,您可以使用该属性作为标志来检查是否退出(在线程没有等待或休眠的情况下)。

您可以编写线程的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();
        }
    }}

下面是一个类似问题的答案,包括示例代码。



查看完整回答
反对 回复 2019-11-06
?
墨色风雨

TA贡献1853条经验 获得超6个赞

你不应该杀其他人的线。这被认为是相当坏的习惯。然而,有许多方法。你可以用return线程的语句run方法。或者,您可以检查线程是否已经被中断,然后它将取消它的工作。F.E.:

while (!isInterrupted()) { 
  // doStuff}


查看完整回答
反对 回复 2019-11-06
  • 3 回答
  • 0 关注
  • 312 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信