2011-04-12 139 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"); 
    } 
}