Ожидать метода класса Condition, не бросающего InterruptedException
У меня странная проблема с методом await класса Condition в Java SE 6. Проблема в том, что метод await NOT всегда выдает исключение при прерывании другим потоком.
В документации написано, что IE бросается, когда:
... какой-то другой поток прерывает текущий поток, и прерывание приостановки потока поддерживается...
Как интерпретировать эту субстанцию: "и прерывание приостановки потока поддерживается"
Это кажется невозможным, чтобы не бросить исключение. У тебя когда-нибудь была подобная проблема?
2 ответа
Его не невозможно не бросить InterruptedException
Что делать, если объект получил сигнал через signal
или же signalAll
API, спецификация говорит, что эти два метода пробудят любые потоки, которые ожидают в этом условии.
У меня была похожая проблема, был поток, ожидающий при условии:
Lock someLock = new ReentrantLock();
Condition someCondition = someLock.newCondition();
...
someCondition.await(timeout, TimeUnit.MILLISECONDS);
и отправка Thread.interrupt() не сработала. Оказалось, что по ошибке другой поток держал заблокированный someLock, поэтому await()
был заблокирован. После того как я добавил someLock.unlock()
в надлежащем месте await() начал генерировать InterruptedException, как и ожидалось.