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

标签 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    }

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

之外的中断状态

最佳答案

如果您捕获 InterruptedException,则中断标志已被清除,这始终是正确的。异常(exception)本身就是您当时的信号机制。捕手需要重新启用标志或直接处理线程关闭。

关于java - 为什么阻塞库方法经常通过调用静态interrupted()而不是实例方法isInterrupted()来响应中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501150/

相关文章:

java - 如何在 Java 中将可选映射转换为流映射

java - 如何在 Java 中运行轮询阻塞消费者?

java - 网络服务器流式传输数据数组中的消费者-生产者问题

JAVA:如何使用扫描仪向字符串数组输入未定义数量的值?

Java Swing Multiinput 第二行的第二个 JTextField

Java 并发收集少写多读

java - 使用类的方法中断 Runnable

java - 不断向 ExecutorService 提交 Runnable 任务,直到工作完成,得到 java.util.concurrent.RejectedExecutionException

java - 在最大消息长度 : 2048 with payload-deserializing-transformer 之前未找到 CRLF

java - JPA/hibernate : "Missing Column" when joining columns