在下列情况下,最好使用isInterrupted而不是中断

时间:2011-01-16 14:04:22

标签: java multithreading

当我修改一些旧代码时,我遇到了。

public void stop() {
    if (this.simulationThread != null) {
        this.simulationThread.interrupt();

        try {
            this.simulationThread.join();
        }
        catch (InterruptedException exp) {
            log.error(null, exp);
        }

        this.simulationThread = null;
     }
}

public void run() {
    while (!Thread.interrupted() && simulationThread == Thread.currentThread()) {
    }
}

我想知道,它会更好用,还是无所谓?

public void run() {
    Thread t = Thread.currentThread();
    // Will it better to use isInterrupted, since it will not clear the interrupt
    // flag?
    while (!t.isInterrupted() && simulationThread == t) {
    }
}

1 个答案:

答案 0 :(得分:2)

这取决于run()退出时您打算发生什么。如果您的run()函数是主线程循环,那么您希望该线程在run()完成后立即退出,那么使用Thread#interrupted()吞下中断标志就可以了。

但通常,这不是你想要做的。如果您尝试启用run()函数的正常退出以允许协作取消,则最好保留调用方的中断标志以及下游阻塞函数进行检测。为此,使用Thread#isInterrupted()是更好的选择。

请注意,在您stop()的{​​{1}}功能中,您还应该调用

InterruptedException

从这里发布的片段中调用Thread.currentThread().interrupt(); 以及之后应该发生什么不清楚,但是,再次保留从stop()中弹出的中断标志会更好。 {1}}。只是捕获stop()允许Thread#join()对该中断作出反应,但是没有调用者或跟随阻塞函数将能够检测到针对当前线程的中断请求。换句话说,只需解锁一个阻塞函数调用就很难满足中断线程;中断请求通常需要一直传播回线程的主函数,以便它可以退出。

最后,您的InterruptedException字段是不稳定的?