在 Java 中,主线程何时停止?

2022-09-01 13:03:39

我读了这句话:

主线程必须是完成执行的最后一个线程。当主线程停止时,程序将终止。

是真的吗?

我还知道“即使主线程死亡,程序也会继续运行”。

这是我目前的理解:

  • 启动程序时,JVM 会创建一个线程来运行程序。
  • JVM 创建一个用于运行程序的用户线程。此线程称为主线程。
  • 该类的方法从主线程调用。main
  • 如果程序从主线程生成新线程,则程序将等到最后一个线程死亡。

哪一个是真的?


答案 1

当所有非守护程序线程都死亡时,程序将终止(守护程序线程是标记为 的线程;它通常用于实用程序线程)。从文档中setDaemon(true)

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

  • 已调用类运行时的 exit 方法,并且安全管理器已允许执行退出操作。
  • 所有不是守护程序线程的线程都已死亡,无论是通过从对 run 方法的调用返回,还是通过引发传播到 run 方法之外的异常。

答案 2

我读到这个声明:“主线程必须是完成执行的最后一个线程。当主线程停止时,程序将终止。是真的吗?

不,它不是。如果最后一个非守护程序线程已完成,虚拟机将终止。它不必是主线程。

简单示例:

public static void main(String[] args) {

   System.out.println("Main thread started");
   new Thread(new Runnable() {
     @Override
     public void run() {
        System.out.println("Second thread started");
        try {
          Thread.sleep(2000);  // wait two seconds
        } catch(Exception e){}
        System.out.println("Second thread (almost) finished");
     }
   }).start();
   System.out.println("Main thread (almost) finished");
}