繁体   English   中英

这是否适当使用Thread.interrupt()?

[英]Is this appropriate use of Thread.interrupt()?

只要线程没有被中断,我想要运行一段代码。 目前我正在做的是:

while(!Thread.interrupted()){
    // .. some code
    try {
        Thread.sleep(4000);
    } catch(InterruptedException ex){
        break;
    }
    // .. some more code
}

我的问题是:这是一个好习惯吗? 是否适当使用interrupt

是的,我认为这是interrupt()目的,所以它似乎是合法的用法。

从概念上讲,这是在正确的轨道上。 但是,有一些细节可以改进。

这是正确的,线程中断机制被用来告诉线程做其他事情,线程可以在它选择的时候响应它的喜好。 在这种情况下,从Thread.sleep()捕获InterruptedException并打破循环是完全合理的事情。 它通常比通常做的更好,也就是完全忽略异常。 (这通常是错误的。)

可能存在的问题是循环条件还会检查线程是否已被中断。 这可能是一个问题,取决于some codesome more code正在做什么。 根据检测到中断时执行的代码块,您的系统可能处于不同的状态。

除非循环的一次迭代运行很长时间(除了睡眠),否则通常只需要在循环中有一个中断点。 在这种情况下,如果线程在执行some code处理时被InterruptedException则在调用Thread.sleep()时将立即生成InterruptedException 因此,您可以将循环条件更改为while (true)并使catch块阻止循环。 (如果这样做,你还应该重新确认中断位;见下文。)

或者,如果您只想检查循环顶部的中断,则可以执行以下操作:

while (!Thread.interrupted()) {
    // .. some code
    try {
        Thread.sleep(4000L);
    } catch (InterruptedException ie) {
        Thread.currentThread().interrupt();
    }
    // .. some more code
}

这样可以安排从循环中只有一个退出点,这可能使代码更容易推理。

注意,这里使用的技术是在捕获InterruptedException之后重新确认线程上的中断位。 处理中断的一般规则是应该重新置位中断位,或者应该传播InterruptedException 如果两者都没有完成,那么调用代码可能会在后续的wait()调用中被阻塞,而不知道它曾经被中断过。 这通常是一个错误。

好的做法是使用较新的更高级别的API,例如ExecutorService 您不应使用较低级别的API,例如线程或synchronizewait / notify

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM