2013-08-31 4 views
0
package com.nacre.test7; 

public class TestDaemon { 

    public static void main(String[] args) throws InterruptedException { 

     MyDaemon dt=new MyDaemon(); 
     if(dt.isDaemon()){ 

      System.out.println(dt+"is demon thread"); 
      Thread.sleep(1000); 
      System.out.println(" main thread is ending."); 
     } 

    } 
} 


package com.nacre.test7; 

public class MyDaemon implements Runnable{ 

    Thread thrd; 

    MyDaemon() { 

     thrd=new Thread(this); 
     thrd.setDaemon(true); 
     thrd.start(); 
    } 

    public boolean isDaemon(){ 

     return thrd.isDaemon(); 
    } 

    public void run() { 
     try { while(true) { 
      System.out.print("."); 
      //Thread.sleep(100); 
      } 
     } catch(Exception exc) { 
      System.out.println("MyDaemon interrupted."); 
      } 
    } 

} 

В вышеприведенном классе 2 я дал точку останова для каждой строки в программе. Я начал отладку в редакторе eclipse и увидел, что поток управления ... ...... возвращаться к этому ниже кода после выполнения thrd.start() метод MyDaemon класса, который вызывает метод run()

if(dt.isDaemon()){ 

      System.out.println(dt+"is demon thread"); 
      Thread.sleep(1000); 
      System.out.println(" main thread is ending."); 
     } 

и ни в коем случае контрольной собирается это ниже части

public void run() { 
     try { while(true) { 
      System.out.print("."); 
      Thread.sleep(100); 
      } 
     } catch(Exception exc) { 
      System.out.println("MyDaemon interrupted."); 
      } 

То, что я знал, что при вызове метода start() c oncurrently jvm вызывает метод run, создавая новый поток, я сомневаюсь, почему я не могу увидеть выполнение метода run при отладке и как я получаю следующий вывод

com.nacre.test7.MyDaemon @ 152b6651is демон поток .......... главный нить завершается.

ответ

0

Ответ на

как я получаю следующие выходные данные [email protected] демон нить .......... основной поток заканчивается.

Программа ведет себя отлично. Вы не можете принять основной поток, чтобы быть живым, если единственный поток, который он запускает, является потоком Daemon. Пожалуйста, прочитайте исходный код/​​java doc класса Thread.

Кроме того, на другой Ваш вопрос мои сомнения в том, что, почему я не могу видеть выполнение метода выполнения при отладке и

Выполнение метода запуска отображается в режиме отладки, как показано ниже: enter image description here

+0

фотографии, которые вы указали, показывают общедоступный метод void run(), но теперь он показывает, что элемент управления находится внутри метода run(), как и другой оператор в классе .......... thats what Я спрашиваю. – rajeev

+0

Вы не сможете это увидеть. Причина Основной поток умирает, как только выполняется последнее утверждение. Итак, теперь вы потеряли отладчик. Если вы хотите увидеть элемент управления в методе run, увеличьте время ожидания до 1,00,000 миллисекунд, а затем установите точку отладки в методе запуска. Он работает – dharam

+0

Кроме того, в тот момент, когда основная нить просыпается, он умрет, а затем вы снова потеряете отладчик. Отладчик недоступен для выполнения потока hte daemon – dharam

2

Java Virtual Machine.

При создании Thread объекта и вызвать start() на него дает JVM специальную инструкцию для создания Java-нить, вот JVM делает несколько глубоких магии, что мы не можем сделать в обычном коде Java. Через собственные вызовы он создает новый поток и заставляет новый поток вызывать метод run().

Согласно Thread#start

Вызов запуска() вызывает эту нить, чтобы начать выполнение; Виртуальная машина Java вызывает метод запуска этой темы.

0

, кто звонит методу run()?

Звонок thrd.start() вызывает в конструкторе MyDaemon его выполнение.

В MyDaemon вы создаете объект Thread и передаете его this в качестве аргумента. Когда объект Thread запущен, он вызывает егоrun(), а поведение по умолчанию объекта Thread.run() заключается в вызове run() на его ... если один из них был поставлен.

Итак:

  1. MyDaemon конструктор создает Thread объект
  2. MyDaemon конструктор вызывает thrd.start()
  3. thrd.start() запускает новый поток с новым стеком
  4. новый поток вызывает thrd.run()
  5. thrd.run() звонки run() на экземпляре MyObject

Обратите внимание, что шаги с 1 по 3 происходит на родительской нити, и шагов с 4 по 5 происходят на дочернем потоке, либо до, либо после того, как start() возвращается вызов в родительском потоке.

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