2014-01-10 66 views
1

當我們創建一個新線程並在run方法本身中啓動它時會發生什麼?當我在run方法內部或外部聲明線程時爲什麼會得到不同的行爲?以下是我嘗試的示例:java中的多線程運行方法中的start方法的行爲是什麼

class MyTDemo implements Runnable { 
    // If I declare t2 here, the program ends after some time 
    // Thread t2; 
public void run()   
    { 
     // If I declare t2 here, the program never ends (until StackOverFlowException) 
     Thread t2; 
     System.out.println("in Run");  
     t2 = new Thread(this);  
     try{   
      t2.sleep(5000); 
      t2.start(); 
      System.out.println("going out "+t2.isDaemon());  
      t2.sleep(5000);   
      t2.setDaemon(true);   
     }  
     catch(Exception e){System.out.println(e.getMessage());} 
}  
    public static void main(String args[])  
{ 
     MyTDemo t = new MyTDemo();  
     Thread t1,t2;  
    t1 = new Thread(t);  
     t1.start();   
     System.out.println("End");   
} 
} 
+0

@assylias:問題不完整。 OP意味着他得到了不同的行爲,但沒有說出那是什麼行爲。 –

+0

是的,我現在看到了@assylias。編輯澄清。代碼有點亂。請注意,「不清楚」意味着不清楚。 –

回答

2
  • 在一種情況下,你後的本地t2變量調用t2.setDaemon(true);下一個線程已啓動。所以你總是至少有一個非守護線程正在運行,並且阻止程序退出。

  • 在其他情況下,您可以設置在的後臺程序狀態共享t2變量,它允許如果一個線程開始之前,這幾運行後會發生隨機執行該語句的程序退出。

你可以t2 = new Thread(this);後添加System.out.println("is daemon: " + t2.isDaemon());更清楚地看到正在發生的事情。

+0

明白了。謝謝 – Tyson

3

您正在遞歸地啓動線程。 MyTDemo正在其run()方法中啓動一個新的MyTDemo線程。

+0

但是在運行和外部運行中聲明t2時行爲的差異呢?它的行爲改變了。我已經評論過。 – Tyson

+0

這是't2'是一個局部變量但不能用共享變量解釋行爲的明顯原因。 – assylias

+0

如果t2以遞歸方式啓動,是否有可能以相同的標識符「t2」開始?因爲據我所知,線程只能啓動一次 – Tyson

相關問題