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
}

多久检查一次线程中断,应该在哪里检查,有什么好的做法?

4

3 回答 3

5

它通常不是您在整个代码中散布的东西。但是,如果您希望能够取消异步任务,则可能需要定期检查中断。换句话说,当您确定需要对中断做出更好响应的代码体时,通常会在事后添加它。

于 2013-04-09T02:39:38.153 回答
3

我通常看不到正在使用线程中断机制 - 同样,如果您的代码没有中断线程,那么线程不需要检查它们是否已被中断。但是,如果您的程序使用线程中断机制,那么将 if(Thread.interrupted()) 检查放在 Runnable 的顶级循环中的好地方: Runnable 通常看起来像

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

你的看起来像

run() {
    try {
        while(true) {
            if(Thread.interrupted()) {
                throw new InterruptedException();
            }
            ...
         }
    } catch (InterruptedException ex) {
        ...
    }
}
于 2013-04-09T02:45:35.083 回答
2

interrupt()一个线程只有在有人调用它的方法时才会被中断。如果您从不调用interrupt(),并且您没有使用调用的库interrupt()(这是您希望拼写出来的内容),那么您不需要检查中断。

有人想要中断线程的主要原因是取消阻塞或长时间运行的任务。例如,锁定机制wait()通常会导致线程永远等待通知,但另一个线程可以中断以强制等待线程停止等待(通常是取消操作)。

于 2013-04-09T02:49:11.767 回答