Thread.interrupted не работает в java

Я читал в Oracle Docs для java, поскольку Thread.interrupted вернет поток в непрерываемый статус. Когда поток проверяет наличие прерывания, вызывая статический метод Thread.interrupted, статус прерывания сбрасывается. Нестатический метод isInterrupted, который используется одним потоком для запроса состояния прерывания другого, не изменяет флаг состояния прерывания.

Пожалуйста, дайте мне знать, что происходит, потому что,

if(Thread.currentThread().isInterrupted())
                {
                       flag = 999;
                       Thread.currentThread().interrupted();
                       System.out.println("Interruption cleared");
                }

Блок выше вообще не вызывается.

public static void main(String args[]) 
{
    int n = 5;
    int flag = 1;
    for (int i = 0; i < n; i++) 
    {

        try
        {
        System.out.println("i:"+i+":n:"+n+":Thread.currentThread().isInterrupted():"+Thread.currentThread().isInterrupted());           
        Thread.sleep(2000);
        if(i==(flag))
            Thread.currentThread().interrupt();         

        }
        catch(Exception e)
        {
            System.out.println(Thread.currentThread().isInterrupted()+"Exception :"+i);
            if(Thread.currentThread().isInterrupted())
            {
                   flag = 999;
                   Thread.currentThread().interrupted();
                   System.out.println("Interuption cleared");
            }

            System.out.println(Thread.currentThread().isInterrupted()+"Exception :"+i);
            e.printStackTrace();
        }

    }
}

Вывод:

i:0:n:5:Thread.currentThread().isInterrupted():false
i:1:n:5:Thread.currentThread().isInterrupted():false
i:2:n:5:Thread.currentThread().isInterrupted():true
falseException :2
falseException :2
i:3:n:5:Thread.currentThread().isInterrupted():false
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at leo.threads.InterruptSleepMessages.main(InterruptSleepMessages.java:14)
i:4:n:5:Thread.currentThread().isInterrupted():false

person sunleo    schedule 22.01.2014    source источник
comment
Вы написали ужасно запутанный кусок кода, как будто ваша цель — запутать себя. Почему бы не попробовать что-то очень простое? currentThread().interrupt(); System.out.println(Thread.interrupted()); System.out.println(Thread.interrupted());   -  person Marko Topolnik    schedule 22.01.2014
comment
Помните: перехват InterruptedException также очищает статус. Вы перехватываете Exception, поэтому также InterruptedException вызывается Thread.sleep, когда i=2. Затем статус очищается с помощью catch, а ваше условие if ложно. Так что он работает отлично.   -  person Fildor    schedule 22.01.2014
comment
@Fildor хорошо, я понял, что Exception также очищает прерванный статус потока. Спасибо за объяснение. Это было полезно.   -  person sunleo    schedule 22.01.2014
comment
Возможно, вы захотите принять ответ на этот вопрос?   -  person Fildor    schedule 18.07.2014


Ответы (1)


То, что я сказал в комментарии, было частично неверным. На самом деле документы Java 7 говорят:

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

Источник: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt()

Таким образом, выбрасываемое InterruptedException очищает статус, а не перехватывает его. Видимый эффект тот же. Когда i=1, флаг устанавливается interrupt(), а выполнение sleep приведет к очистке флага и выдаче исключения, которое приводит к видимому выводу.

См. также: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep(long)

person Fildor    schedule 22.01.2014
comment
Извините, @fildor, уже слишком поздно. Спасибо за ответ. - person sunleo; 18.07.2014