2011-04-12 182 views
19

我有兩個線程:主線程和主線程生成的線程。主線程退出程序終止?

當主線程退出時,整個程序是否會終止?

+0

如果有任何線程調用System.exit()程序可以退出,但是如果所有main都返回,則非守護線程將使應用程序繼續運行。 – 2011-04-12 23:34:00

+7

對於像這樣定義好的東西,你應該首先嚐試一下;你會得到答案,如果你仍然有一個問題,你可以發佈一個代碼片段,使討論更有價值的其他誰有同樣的問題。 – coffeetocode 2011-04-13 00:57:56

回答

26

編號

Java程序在所有非守護程序線程完成時終止。

documentation狀態:

當Java虛擬機啓動時,通常 有一個非守護線程 (通常調用名爲主一些指定 類的 方法)。 Java虛擬機 繼續執行線程,直到 下列任一情況:

  • Runtime類的exit方法被調用和 安全管理器允許 退出操作發生。
  • 所有線程都沒有守護線程已經死亡,無論是通過拋出該 傳播超越了run方法的異常從調用run方法或 返回 。

如果你不想運行時等待的線程,調用setDaemon method

2

編號 主線程爲非惡魔線程,除非您的子線程爲惡魔線程,即使主線程在子線程完成之前程序也不會終止。你可以使用下面的示例程序來檢查。

public class app { 

public static void main(String[] args) throws InterruptedException { 
    app2.mt=Thread.currentThread(); 
    app2 t = new app2(); 
    t.start(); 
    System.out.println("Main starts"); 
    Thread.sleep(2000); 
    System.out.println("Main ends"); 

    } 
} 

class app2 extends Thread{ 
static Thread mt; 
public void run(){ 
    try { 
     mt.join();//waits till main thread dies. 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("child thread"); 
    } 
}