为什么阻塞库方法通常通过调用static interrupted()而不是实例方法isInterrupted()来响应中断?

Gee*_*eek 0 java java.util.concurrent

请考虑以下来自java.util.concurrent.locks.AbstractQueuedSynchronizer的代码,作为标题中提出的想法的众多示例之一:

1258    public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout) throws Interrupted Exception {
1259        if (Thread.interrupted())
1260            throw new InterruptedException();
1261        return tryAcquireShared(arg) >= 0 ||
1262            doAcquireSharedNanos(arg, nanosTimeout);
1263    }
Run Code Online (Sandbox Code Playgroud)

为什么大多数阻塞库方法通过调用静态方法Thread.interrupted()而不是实例方法来响应中断isInterrupted().调用静态方法也会清除中断状态,因此即使任务处理代码吞下InterruptionException,调用者也无法知道除了中断状态之外的其他状态.

Mar*_*nik 5

如果你抓到了InterruptedException,那么中断的标志已经被清除了.异常本身就是您的信号机制.捕手需要重新启用标志或直接注意线程移动到关闭.