【问题标题】:termination of program on main thread exit?在主线程退出时终止程序?
【发布时间】:2011-04-12 23:31:32
【问题描述】:

我有两个线程:主线程和从主线程生成的线程。

当主线程退出时,整个程序会终止吗?

【问题讨论】:

  • 如果任何线程调用 System.exit() 程序可以退出,但是如果所有 main 都返回,非守护线程将保持应用程序运行。
  • 对于像这样定义明确的东西,你真的应该先尝试一下;你会得到答案,如果你还有问题,你可以发布一个代码 sn-p,这将使讨论对有相同问题的其他人更有价值。

标签: java


【解决方案1】:

没有。

Java 程序在所有非守护线程完成后终止。

documentation 声明:

当 Java 虚拟机启动时, 通常只有一个非守护进程 线程(通常调用 一些指定的名为 main 的方法 班级)。 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");
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2017-04-21
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2011-02-03
      • 2012-04-29
      相关资源
      最近更新 更多