java:为什么主线程等待子线程完成

Nis*_*mar 3 java multithreading

我有一个简单的java程序。一个主线程 ( main()) 被创建并启动另一个线程t

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

end
Inside thread
Inside thread
Inside thread
....
....
Run Code Online (Sandbox Code Playgroud)

它无限打印Inside thread。我不是在使用 join() 等待主线程中的子线程。打印结束后主线程不应该退出吗?

更新:

当 Java 虚拟机启动时,通常有一个非守护线程(通常调用某个指定类的名为 main 的方法)。Java 虚拟机继续执行线程,直到发生以下任一情况:

  • 已调用 Runtime 类的退出方法并且安全管理器已允许退出操作发生。
  • 所有不是守护线程的线程都已死亡,要么是从对 run 方法的调用中返回,要么是通过抛出传播到 run 方法之外的异常。

我找到了原因。第二点澄清了它。我假设所有子线程都将在主线程退出后终止(我错了)并且 JVM 应该关闭。

Kay*_*man 6

主线程已经退出。这是另一个还活着的线程。