Подтвердить что ты не робот

Прерывание потока: отменит ли он вызов oncoming wait()?

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

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

4b9b3361

Ответ 1

да, прерванный поток будет вызывать 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 - если какой-либо поток прервал текущий поток до или пока текущий поток ожидал уведомления. Прерванный статус текущего поток очищается при этом исключении.

Ответ 2

Ознакомьтесь с спецификациями API для Thread.interrupt() -

Прерывает этот поток.

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

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

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

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

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

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

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

ИЗМЕНИТЬ

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

Броски:

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