2013-08-31 48 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."); 
     } 

和noway控制後,將會在下面這個部分

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

我知道什麼是當調用start()方法時,同時調用jvm調用創建一個新的線程上運行的方法,我的疑問是,爲什麼我無法看到的run方法的執行,同時調試 ,我如何得到以下輸出

[email protected]妖線程 ..........主線程正在結束。

回答

0

答到

我如何得到以下輸出 [email protected]妖線程..........主線程結束。

該程序表現得非常好。如果啓動的唯一線程是守護程序線程,則不能接受主線程處於活動狀態。請閱讀Thread類的源代碼/ java文檔。

此外,爲了您的其他問題我的疑問是,爲什麼我無法看到的run方法的執行,同時調試和

run方法執行在如下調試模式中顯示: enter image description here

+0

你給出的圖片顯示的是public void run()方法,但是現在它顯示的是控制進入run()方法,就像類中的其他語句..........那是什麼我在問。 – rajeev

+0

你將無法看到。原因主線程在執行最後一條語句後就會死亡。所以現在你已經失去了調試器。 如果您想在運行方法中看到該控件,請將睡眠時間增加到1,00,000毫秒,然後在運行方法中放置一個調試點。它的工作原理 – dharam

+0

此外,當主線程喚醒時它會死掉,然後你將再次失去調試器。調試器不可用於hte守護進程線程執行 – dharam

2

Java Virtual Machine

當您創建Thread對象,並調用它start()JVM特殊的指令來創建Java線程,這裏JVM做一些冥神功,我們不能在普通的Java代碼做。通過本地調用它創建一個新線程,並使新線程調用run()方法。

根據Thread#start

調用start()導致該線程開始執行; Java虛擬機調用此線程的運行方法

0

誰打電話給run()方法?

thrd.start()調用MyDaemon構造函數正在導致它發生。

MyDaemon您實例化一個Thread對象並將它作爲參數傳遞給this。當一個Thread對象啓動時,它會調用run()方法,並且Thread.run()對象的默認行爲是在其Runnable ...上調用run() ...如果提供了該對象。

所以:

  1. MyDaemon構造函數創建一個Thread對象
  2. MyDaemon構造函數調用thrd.start()
  3. thrd.start()啓動新線程一個新的堆棧
  4. 新的線程調用thrd.run()
  5. thrd.run()調用run()MyObject實例

注意,步驟1至3發生父線程,並且步驟4至5發生在子線程上,前,或父線程start()調用返回後。

相關問題