Java wait () не выбрасывает InterruptedException - PullRequest
4 голосов
/ 19 мая 2011

У меня есть объект в потоке A , который вызывает wait(), в то время как другой объект в потоке B выполняет некоторую работу, затем вызывает потока объекта A notify(). Затем поток А выполняет некоторую постобработку.

Моя проблема довольно проста:

synchronized(this)
{
    while(!flag)
    {
        try
        {
            wait();
            getLogger().info("No longer waiting");
        }
        catch (InterruptedException ie)
        {
            getLogger().info("Wait threw InterruptedException");
        }
    }
}

Результатом является информационное сообщение «Больше не ждать» вместо «Ожидание выбросило InterruptedException».

Я запутался из-за этого (http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait()):

Броски:

InterruptedException - если другой поток прервал текущий поток до или в то время как текущий поток ожидал уведомление. Прерванный статус текущего потока очищается когда выдается это исключение.

Почему у меня странное поведение?

Спасибо.

Ответы [ 4 ]

10 голосов
/ 19 мая 2011

Когда поток ожидает, используя wait(), он фактически ждет notify().Поэтому, если notify() вызван другим потоком, этот поток будет продолжен, если вы вызовете interrupt(), вы получите исключение.

Кроме того, из документов, на которые вы ссылались:

Заставляет текущий поток ждать, пока другой поток не вызовет метод notify () или метод notifyAll () для этого объекта

notify освобождает поток от блокировки.

InterruptedException - если другой поток прервал текущий поток до или в то время, когда текущий поток ожидал уведомления.

3 голосов
/ 19 мая 2011

notify() не делает wait() throw InterruptedException. notify() пусть wait() продолжить нормальный ход программы.

2 голосов
/ 19 мая 2011

notify() не является ненормальным завершением для потока, который wait() -ing. Вы получите исключение, если, например, поток был прерван до вызова notify(), а не в результате вызова notify(). Нить не была прервана - она ​​проснулась.

0 голосов
/ 19 мая 2011

Обратите внимание, что у вас есть ошибка в этом коде.Wait всегда должен вызываться в цикле и проверять состояние после пробуждения.

ожидание может быть пробуждено ложным пробуждением.См. Javadoc wait ()

...