Прерывание потока: отменит ли он ожидающий вызов wait ()? - PullRequest
11 голосов
/ 14 июля 2011

У меня есть поток, в котором есть очередь входящих заданий (LinkedList, содержащая описания заданий).Поток блокируется с wait() в очереди, когда нет работы для работы.Внешний объект диспетчера заданий пробуждает его с notify(), когда он помещает новые задания в очередь.

При закрытии моей программы я вызываю interrupt() в потоке.Это повышает InterruptedException, когда поток ожидает выполнения заданий в wait().Мой вопрос: что произойдет, если я прерву поток, пока он не блокирует, а выполняет какую-то работу, обработанный элемент был последним в очереди (так что очередь теперь пуста), и выполнение вставляет проверку isInterrupted() перед прерываниемфлаг установлен, поэтому он снова вызывает wait()?Будет ли он выдавать InterruptedException, потому что флаг прерывания уже установлен или поток ждет вечно, потому что новые задания никогда не поступят в очередь, и нет никого, кто прервал бы ожидание?

Ответы [ 2 ]

11 голосов
/ 14 июля 2011

Прочитайте спецификации API для Thread.interrupt() -

Прерывает эту тему.

Если текущий поток не прерывает себя, что всегда разрешено, вызывается метод checkAccess этого потока, который может вызвать исключение SecurityException.

Если этот поток заблокирован при вызове wait (), wait (long), или методы wait (long, int) класса Object или join (), методы join (long), join (long, int), sleep (long) или sleep (long, int), методы этого класса, то его статус прерывания будет очищен, и он будет получить InterruptedException.

Если этот поток заблокирован в операции ввода-вывода при прерывании канал, то канал будет закрыт, состояние прерывания потока будет установлен, и поток получит исключение ClosedByInterruptException.

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

Если не выполняется ни одно из предыдущих условий, прерывание этого потока статус будет установлен.

Прерывание нити, которая не является живой, не должно иметь никакого эффекта.

Итак, все, что произойдет, будет установлено состояние прерывания потока.

EDIT

Если вы прочитаете спецификации API для Object.wait(), вы увидите следующее -

Выдает:

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

9 голосов
/ 14 июля 2011

да, ваш прерванный поток вызовет исключение InterruptedException при вызове wait (). это довольно просто проверить самостоятельно.

public class TestInt {
    public static void main(String[] args) throws Exception
    {
        Thread.currentThread().interrupt();

        synchronized(TestInt.class) {
            TestInt.class.wait();
        }    
    }    
}

также обратите внимание на javaodc для Object.wait():

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...