为什么线程在 Java 中的 main 方法中比主方法的寿命更长?

2022-09-01 06:27:13

我正在自学Java线程,我注意到一些让我有点困惑的事情。我做了一个名为 implementing 的类。run 方法只需打印“Hello World”,休眠一秒钟,然后重复。engineRunnable

在我的主要方法中,我有:

public static void main(String[] args) {
    Thread thread = new Thread(engine);
    thread.start();
    System.out.println("Done.");
}

正如我所料,我看到“Hello World”和“Done.”打印得很快,这意味着主要方法已经到达终点,但我没想到的是,即使在到达main的结尾之后,我开始的线程仍然继续运行。

为什么程序即使在主退出后仍继续执行?我本来以为当main退出时,进程将终止,所有线程将被强制清理。这是否意味着必须显式连接/终止每个线程才能终止 Java 程序?


答案 1

因为这就是它的工作原理。程序在调用时或最后一个非守护程序线程停止运行时退出。System.exit()

这是有道理的。如果没有此规则,例如,每个仅生成GUI的Java程序都必须无限等待()以避免程序立即退出。


答案 2

如果希望程序在 main 方法完成时退出,请考虑使线程成为守护程序。但请注意,当 main 完成时,守护进程线程将被中止。
你可以创建一个守护进程,如下所示:

Thread t = new Thread(...);
t.setDaemon(true);

所有非守护程序线程都是用户线程。这些线程正在阻止 jvm 关闭。