主线程何时停止在Java中?

我读了这个声明:

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

这是真的吗?

我也来了解“即使主线程序死机程序继续运行”。

据我的理解:当你启动一个程序,JVM创build一个线程来运行你的程序。 JVM创build一个用于运行程序的用户线程。 这个线程被称为主线程。 该类的主要方法是从主线程调用。 如果程序从主线程产生新的线程,它会停止,直到最后一个线程死亡。

哪一个是真的?

当所有非守护进程线程死亡时,程序终止(守护进程线程是一个标有setDaemon(true)的线程setDaemon(true) ;它通常用于工具线程)。 来自javadoc :

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

  • 类Runtime的退出方法已经被调用,并且安全pipe理器已经允许退出操作发生。
  • 所有不是守护线程的线程都已经死了,要么从调用返回到run方法,要么抛出一个超出run方法的exception。

我读这个语句:“主线程必须是最后一个线程才能完成执行。 当主线程停止时,程序终止。“是真的吗?

不它不是。 如果最后一个非后台线程完成,虚拟机将终止。 它不一定是主线程。

简单的例子:

 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"); } 

当主线程停止时,程序终止。

当程序不再有任何非守护线程运行时(或者有人叫做System.exit),程序终止。 主线程可以在很久以前完成。

当主线程和所有非守护线程完成执行时,JVM将退出。

当你创build一个新的线程时,你可以调用Thread.setDaemon(true)使它成为一个守护线程。 如果你这样做,那么JVM就不会等到这个线程在执行之前完成。 这对你创build的任何线程都是有用的,这些线程在程序停止之前在后台运行。

如果创build了一个新的线程并且不调用Thread.setDaemon(true) ,那么即使主线程完成,JVM也会延迟退出直到该线程完成。

当主线程启动时,它不会等待我们创build的另一个线程,直到它们不能使用线程类的join()来等待这个线程。 所以基本上如果子线程或子线程获得更多的时间来处理任务,你不使用join(),那么主线程可能会停止。 要保持与主线程,你必须使用join(),所以主线程停止后,只有相关的线程停止

检查这个链接

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join%28%29

第一个陈述并不准确。 当所有非守护进程线程被终止或调用System.exit()Runtime.exit()时,java程序终止。

线程在退出run()方法时被终止。 主线程是特殊的,因为你没有明确地实现它的run()方法,而是实现main()main()是从run()调用的。 所以,当main()被终止时,主线程被终止。

但主线不是最后一个。

这是来自JVM规范第三稿,所以这是我所知道的最新的:

5.7虚拟机退出

Java虚拟机将终止其所有活动并在以下情况下退出:• 不是守护进程线程的所有线程均终止。 有些线程调用Runtime类或System类的exit方法,安全pipe理器允许退出操作。

主线程没有区别,所以我们不应该认为它是唯一适用的。