【问题标题】:await method of class Condition not throwing InterruptedExceptionCondition类的await方法不抛出InterruptedException
【发布时间】:2011-11-30 16:51:27
【问题描述】:
Java SE 6 中 Condition 类的 await 方法有一个奇怪的问题。
问题是 await 方法在被另一个线程中断时并不总是抛出异常。
在文档中写到 IE 在以下情况下被抛出:
...
其他一些线程中断当前线程,支持中断线程挂起
...
如何解释这个分句:“并且支持线程挂起的中断”
不抛出异常似乎是不可能的。
你有过类似的问题吗?
【问题讨论】:
标签:
java
multithreading
java.util.concurrent
concurrency
interrupted-exception
【解决方案1】:
如果对象通过signal 或signalAll API 接收到信号,不抛出InterruptedException 并非不可能,规范说这两种方法将唤醒任何在这种情况下等待的线程。
【解决方案2】:
我有一个类似的问题,有一个线程在等待一个条件:
Lock someLock = new ReentrantLock();
Condition someCondition = someLock.newCondition();
...
someCondition.await(timeout, TimeUnit.MILLISECONDS);
并发送 theThread.interrupt() 不起作用。事实证明,另一个线程错误地持有 someLock 锁定,因此 await() 被阻止。在我在适当的位置添加someLock.unlock() 之后,await() 开始按预期抛出 InterruptedException。