检查InterruptedException的好方法是什么?

4

我是Java世界的新手,如果问题很蠢请见谅。

最近我在Runnable对象的run()方法中看到了以下代码:

try {
    if (Thread.interrupted()) {
       throw new InterruptedException();
    }

    // do something 

    if (Thread.interrupted()) {
        throw new InterruptedException();
    }

    // do something 

    if (Thread.interrupted()) {
        throw new InterruptedException();
    }

    // and so on

} catch (InterruptedException e){
     // Handle exception
} finally {
     // release resource
}

您应该经常检查线程中断,并在何处进行检查,有哪些好的实践方法?

3个回答

5

这不是你随意在代码中添加的内容。但是,如果你希望能够取消异步任务,可能需要定期检查是否有中断。换句话说,在确定需要更加响应中断的代码段之后,通常需要添加此功能。


谢谢,用户可以按键或鼠标点击来中断吗?我只是想到另一种情况:我们可以将其放在长时间执行之前,因此如果线程在进入该部分之前被中断,我们可以终止线程,而不浪费CPU或内存来执行不再有效的操作。 - jAckOdE
@jAckOdE - 中断是在某些代码调用thread.interrupt()时发生的事情。 - jtahlborn

3

通常我不会看到线程中断机制被使用 - 同样,如果你的代码没有中断线程,那么线程就不需要检查它们是否已被中断。然而,如果你的程序正在使用线程中断机制,那么一个好的地方来放置if(Thread.interrupted())检查是在你的Runnable的顶层循环中:一个Runnable通常会像这样:

run() {
    while(true) {
        ...
    }
}

你的代码应该像这样:

...

run() {
    try {
        while(true) {
            if(Thread.interrupted()) {
                throw new InterruptedException();
            }
            ...
         }
    } catch (InterruptedException ex) {
        ...
    }
}

谢谢,对于包含无限循环的run()方法,我认为这可能是标准模式。 - jAckOdE

2
一个线程只有在有人调用其 interrupt() 方法时才会被中断。如果你从未调用 interrupt(),并且你没有使用调用 interrupt() 的库(这是你期望明确说明的东西),那么你不需要检查是否被中断。
有人想要中断线程的主要原因是取消阻塞或长时间运行的任务。例如,锁定机制 wait() 通常会导致线程无限期地等待通知,但另一个线程可以中断以强制等待线程停止等待(通常这将是为了取消操作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接