2015-05-29 4 views
0

У меня есть следующий код, который мне странный. Сообщение журнала показывает, что текущий поток не прерывается, почему?Когда установлен флаг прерывания потока?

final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10); 
Thread thread = new Thread() { 
    public void run() { 

    while (!Thread.currentThread().isInterrupted()) { 
     try { 
     LOG.info("start to take"); 
     String next = queue.take(); 
     LOG.info(next); 
     } catch (InterruptedException e) { 
     LOG.info(e + ""); 
     LOG.info("IsInterupted:" 
      + Thread.currentThread().isInterrupted()); 
     continue; 
     } 

    } 
    } 
}; 

thread.start(); 
Thread.sleep(1000); 
thread.interrupt(); 

ответ

4

Он устанавливается, когда кто-то вызывает .interrupt() в потоке.

Причина, по которой вы не видите прерванное состояние в своем случае, заключается в том, что .take() очистит флаг, когда он выдает исключение.

Попробуйте это и посмотреть:

Thread t = new Thread(() -> { 
    while (true) 
     System.out.println(Thread.currentThread().isInterrupted()); 
}); 
t.start(); 
Thread.sleep(1000); 
t.interrupt(); 

В общем, .interrupt() не принуждается в любом случае (если поток не ждет, увидеть Javadoc ниже) - это вплоть до нить, чтобы опросить его и действовать соответственно. (Как и в этом случае, снимите флаг и бросить InterruptedException.)

Вы можете прочитать больше о том, как .interrupt() работает здесь: https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt--

Смежные вопросы