在 Java 中,主线程何时停止?
2022-09-01 13:03:39
我读了这句话:
主线程必须是完成执行的最后一个线程。当主线程停止时,程序将终止。
是真的吗?
我还知道“即使主线程死亡,程序也会继续运行”。
这是我目前的理解:
- 启动程序时,JVM 会创建一个线程来运行程序。
- JVM 创建一个用于运行程序的用户线程。此线程称为主线程。
- 该类的方法从主线程调用。
main
- 如果程序从主线程生成新线程,则程序将等到最后一个线程死亡。
哪一个是真的?
我读了这句话:
主线程必须是完成执行的最后一个线程。当主线程停止时,程序将终止。
是真的吗?
我还知道“即使主线程死亡,程序也会继续运行”。
这是我目前的理解:
main
哪一个是真的?
当所有非守护程序线程都死亡时,程序将终止(守护程序线程是标记为 的线程;它通常用于实用程序线程)。从文档中:setDaemon(true)
当 Java 虚拟机启动时,通常只有一个非守护程序线程(通常调用某个指定类的名为 main 的方法)。Java 虚拟机将继续执行线程,直到发生以下任一情况:
- 已调用类运行时的 exit 方法,并且安全管理器已允许执行退出操作。
- 所有不是守护程序线程的线程都已死亡,无论是通过从对 run 方法的调用返回,还是通过引发传播到 run 方法之外的异常。
我读到这个声明:“主线程必须是完成执行的最后一个线程。当主线程停止时,程序将终止。是真的吗?
不,它不是。如果最后一个非守护程序线程已完成,虚拟机将终止。它不必是主线程。
简单示例:
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");
}