2014-11-20 1 views
0

Я понял, что ниже код дает результат как false, но когда мы видим этот экземпляр Thread, поток, который мы создали, задан как демон и по-прежнему работает, то почему метод вызывает thread.isAlive(), возвращает false , давая неправильное впечатление, что «нить завершена и мертва»Почему метод isAlive() экземпляра Thread дает неправильный результат?

public class MyThreads { 

    private static class MyDaemonThread extends Thread { 

     public MyDaemonThread() { 
      setDaemon(true); 
     } 

     @Override 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 
     Thread thread = new MyDaemonThread(); 
     thread.start(); 
     thread.join(); 
     System.out.println(thread.isAlive()); 
    } 
} 

У любого есть идея по этому вопросу?

+3

Это не отображается неверно? Поскольку 'join()' будет ждать завершения потока. Также не имеет значения, является ли поток демонами или нет в этом примере. – Kayaman

+2

Последняя строка не будет называться до тех пор, пока поток не завершится из-за использования 'thread.join();', который присоединяется к потоку 'main', чтобы дождаться его конца. – Braj

+2

Неправильное впечатление о том, что «поток завершен и мертв» На самом деле это. 'Join()' заставляет программу ждать завершения потока, поэтому при печати 'thread.isAlive()' поток будет – BackSlash

ответ

4

thread.join(); - это выражение, которое сообщает основному потоку ждать завершения thread. поэтому, когда поток завершен, он переходит только к заявлению на печать. поэтому его правильный результат, потому что thread уже завершен.

если вы удалите join, вы увидите результат истинно

+0

Привет, Дима, но последняя строка, "thread.isAlive()" - проверить, жив ли поток или нет, не этот оператор печати должен печатать true, но он печатает только false. Без средств соединения этот оператор печати все еще выполняется основным потоком, так как для основного потока нет необходимости ждать, поэтому мои сомнения связаны с или без join(), это должен всегда печатать только true. для потока Daemon о котором я упомянул. – Bravo

+0

как я уже сказал, объединение буквально ждет окончания потока, поэтому он никогда не будет жив после него – Dima

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