2015-02-25 2 views
2
Thread t = new Thread(){ 
     public void run(){ 
      while(true){ 

      } 
     } 
    }; 

    t.start(); 

    t.interrupt(); 
    System.out.println(t.interrupted()); 

У меня возникла проблема, когда я вызываю прерывание по потоку, а затем проверяю, прерывается ли поток - он всегда возвращает false. Зачем?Thread возвращает false при прерывании вызова после вызова прерывания

+0

см. Эту ссылку: http://stackoverflow.com/questions/ 3590000/what-does-java-lang-thread-interrupt-do – aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

ответ

3

Из Java Thread docs (курсив мой):

static boolean interrupted(): проверяет, является ли тока поток был прерван.

Это на самом деле статический метод (а) предназначен для использования в целевой нити, чтобы увидеть, если кто-то прервал его, следовательно, вы будете использовать его в самой t.run().

Поток также может быть уведомлен InterruptedException, если они вызвали метод, который выдает это исключение, например Thread.sleep().

И, согласно этой ссылке выше, в описании подробных из Thread.interrupted(), как поток очищает свой собственный статус прерывания от вызова это:

Прерванное состояние резьбы очищается этим методом.


Чтобы проверить, если разные нить была прервана, используйте нестатические isInterrupted():

boolean isInterrupted(): тесты, была ли прервана эта нить.


(а) Я часто думал, что это было бы хорошей идеей, если компилятор предупредить вас, если вы вызываете статический (на уровне класса) метод на конкретном объекте. Я видел несколько случаев, когда люди были укушены подобными проблемами.

Но тогда я думаю, почему? Люди, использующие язык, должны понимать язык, даже глубокие темные его углы, например, C (например) имеет довольно несколько из них :-)

+0

Как сбросить прерванный флаг при вызове isInterrupted? Это была основная причина, по которой меня прервали. – user2871354

+0

@ user2871354, это зависит от потока, который был прерван, чтобы справиться с этим. – paxdiablo

+0

Как бы эта нить это сделала? – user2871354

1

прерываться() является статическим методом, он называется на текущем потоке, попробуйте t.isInterrupted()

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