Вызов Thread.sleep() с * прерванным статусом * установлен?

В настоящее время документация по Java не ясна. Что произойдет, если вы вызовете прерывание в потоке, прежде чем он вызовет Thread.sleep():

        //interrupt reaches Thread here
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            return;
        }

Будет ли выбрано InterruptedException?

Укажите соответствующую документацию.

Ответ 1

Да, это вызовет исключение. Согласно javadoc для Thread.sleep, метод:

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

"Имеет" в этом случае является неформальным способом обращения к прерванному статусу. Это позор, что он неформальный - если там где-то спецификация должна быть точной и однозначной, ну, она везде, но это первопроходцы, прежде всего.

Способ, с которым работает механизм прерывания, в общем случае - это то, что поток получает прерывание, пока он не прерывается (поскольку он работает), тогда прерывание по существу состоит в том, чтобы ждать, пока поток не будет прерван, вызывает Прерывание Исключения. Это пример этого механизма.

Ответ 2

Поток может быть прерван в любой момент времени, но он не будет иметь никакого эффекта, пока этот поток не проверит его прерывистое состояние с Thread.currentThread().isInterrupted() или когда он достигнет или уже заблокирован вызовом Thread.sleep(long), Object.wait(long) или другие стандартные методы JDK, которые бросают InterruptedException, например, в пакет java.nio. Статус прерывания потока reset, когда вы ловите InterruptedException или когда вы явно вызываете Thread.interrupted() (см. Документацию для этого неуловимого метода).

Эта статья JavaSpecialists должна объяснить немного больше о том, как работают прерывания потоков и как правильно их обрабатывать.

Ответ 3

Вы можете использовать следующий класс для проверки поведения. В этом случае цикл не прерывается, и поток умирает, когда он доходит до сна.

открытый класс TestInterrupt {

public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(){
        public void run(){
            System.out.println("hello");
            try {
                for (int i = 0 ; i < 1000000; i++){
                    System.out.print(".");
                }
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                System.out.println("interrupted");
                e.printStackTrace();  
            }

        }
    };
    t.start();
    Thread.sleep(100);
    System.out.println("about to interrupt.");
    t.interrupt();

}

}

Ответ 4

Документы InterruptedException, по-видимому, предполагают, что их можно прервать в другое время

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/InterruptedException.html

Бросок, когда поток ожидает, спящий или иначе приостановлен в течение длительного времени, а другой поток прерывает его с использованием метода прерывания в классе Thread

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

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#interrupt()