主线程何时在Java中停止?

Sar*_*nan 27 java multithreading jvm

我读了这句话:

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

这是真的吗?

我也开始知道"即使主线程程序继续运行".

据我所知:当你启动一个程序时,JVM会创建一个线程来运行你的程序.JVM创建一个用于运行程序的用户线程.该线程称为主线程.从主线程调用类的主要方法.如果程序从主线程生成新线程,它会一直停止,直到最后一个线程死掉.

哪一个是真的?

axt*_*avt 20

当所有非守护程序线程死亡时,程序终止(守护程序线程是标记有的线程setDaemon(true);它通常用于实用程序线程).来自javadoc:

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

  • 已调用类Runtime的exit方法,并且安全管理器已允许执行退出操作.
  • 所有非守护程序线程的线程都已死亡,无论是通过从run方法调用返回还是抛出传播超出run方法的异常.


And*_*s_D 14

我读到了这句话:"主线程必须是完成执行的最后一个线程.当主线程停止时,程序终止."这是真的吗?

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

简单的例子:

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