Вызов Thread.sleep () с * установленным статусом прерывания *? - PullRequest
13 голосов
/ 15 апреля 2011

Документация по Java не ясна по этому вопросу.Что происходит, если вы вызываете прерывание в потоке до , оно вызывает Thread.sleep () :

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

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

Пожалуйста, укажите соответствующую документацию.

Ответы [ 4 ]

11 голосов
/ 15 апреля 2011

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

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

В этом случае «has» - это неофициальный способ ссылки на прерванное состояние.Обидно, что это неформально - если где-то спецификация должна быть точной и однозначной, ну, она везде, но прежде всего это потоковые примитивы.

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

7 голосов
/ 15 апреля 2011

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

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

3 голосов
/ 15 апреля 2011

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

открытый класс 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();

}

}

1 голос
/ 15 апреля 2011

Документы 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()

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