2017-02-28 112 views
-2

我有一個簡單的java程序。一個主線程(main())被創建並啓動另一個線程tjava:爲什麼主線等待子線程完成

class T extends Thread{ 
    @Override 
    public void run() { 
     while (true){ 
      System.out.println("Inside thread"); 
     } 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Thread t = new T(); 
     t.start(); 
     //t.join(); 
     System.out.println("end"); 
    } 
} 

輸出:

end 
Inside thread 
Inside thread 
Inside thread 
.... 
.... 

它無限打印內螺紋。我不是在使用join()的主線程中等待子線程。打印後不應該退出主線程結束

更新:

當Java虛擬機啓動時,通常有一個 非守護線程(它通常會調用命名爲主要的一些 指定類中的方法)。 Java虛擬機繼續直至出現以下任何一種情況發生時執行 主題:Runtime類的

  • 退出方法被調用並且安全管理器允許退出操作發生。
  • 所有不是守護進程線程的線程都已死亡,可以通過從調用返回運行方法或通過拋出傳播超出run方法的異常 。

我找到了原因。第二點澄清了它。我假定所有子線程在主線程退出(我錯了)之後會終止,並且JVM應該關閉。

+0

是什麼讓你覺得主線程沒有退出? –

+0

這是一個愚蠢的錯誤:(@DavidSchwartz –

+0

我應該問爲什麼JVM而不是主線程 –

回答

4

主線程已退出。這是另一個線程,仍然活着。

+0

這可以通過在另一個線程中的print語句之後添加Thread.sleep(1000)而變得明顯。 –

0

您製作的線程與main方法不同步。因此,調用t.start()後發生兩個進程。一旦main結束,主進程完成,但線程仍在繼續。

爲了更好地觀察此情況,請在線程的while循環而不是true的條件下使用布爾變量,以使線程僅打印5次。

class T extends Thread{ 
    int count; 
    @Override 
    public void run() { 
     while (count < 5){ 
      System.out.println("Inside thread"); 
      count++; 
     } 
    } 
} 

請注意,如果沒有辦法終止它,線程將不會自行停止。主要方法結尾不會終止線程。

0

註釋方法t.join()正是線程等待調用者線程結束所需的。請參閱線程javadoc以獲取更多詳細信息

0

以下代碼將永久運行。請修復你的while循環控制邏輯

while (true) { 
System.out.println("Inside thread"); 
}