Java中的主线程何时停止?
我宣读了这项声明: 主线程必须是完成执行的最后一个线程。当主线程停止时,程序终止 这是真的吗 我也知道即使主线程死了,程序也会继续运行 这是我目前的理解: 启动程序时,JVM会创建一个线程来运行程序。 JVM为运行程序创建一个用户线程。这个线程称为主线程。 类的main方法是从主线程调用的。 如果程序从主线程生成新线程,则程序将等待直到最后一个线程死亡。Java中的主线程何时停止?,java,multithreading,jvm,Java,Multithreading,Jvm,我宣读了这项声明: 主线程必须是完成执行的最后一个线程。当主线程停止时,程序终止 这是真的吗 我也知道即使主线程死了,程序也会继续运行 这是我目前的理解: 启动程序时,JVM会创建一个线程来运行程序。 JVM为运行程序创建一个用户线程。这个线程称为主线程。 类的main方法是从主线程调用的。 如果程序从主线程生成新线程,则程序将等待直到最后一个线程死亡。 哪一个是真的?当所有非守护进程线程死亡时,程序终止。守护进程线程是标记为setDaemontrue的线程;它通常用于实用程序线程。从: 当Ja
哪一个是真的?当所有非守护进程线程死亡时,程序终止。守护进程线程是标记为setDaemontrue的线程;它通常用于实用程序线程。从: 当Java虚拟机启动时,通常有一个非守护进程线程,该线程通常调用某个指定类的main方法。Java虚拟机将继续执行线程,直到发生以下任一情况: 类运行时的exit方法已被调用,并且安全管理器已允许执行exit操作。 所有不是守护进程线程的线程都已死亡,要么是通过调用run方法返回,要么是通过抛出传播到run方法之外的异常。 当主线程停止时,程序终止
当不再有任何非守护进程线程运行或有人调用System.exit时,程序终止。主线程可能早就完成了 我读到这样的语句:“主线程必须是最后一个完成执行的线程。当主线程停止时,程序终止。”这是真的吗 不,不是。如果最后一个非守护进程线程已完成,则虚拟机将终止。它不必是主线程 简单的例子:
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");
}
当主线程和所有非守护进程线程完成执行时,JVM将退出
创建新线程时,可以调用thread.setDaemontrue使其成为守护进程线程。如果这样做,JVM将不会等到该线程完成后再执行。这对于您创建的任何线程都很有用,这些线程将在后台运行,直到程序停止
如果创建一个新线程而不调用thread.setDaemontrue,则JVM将延迟退出,直到该线程完成,即使主线程已完成。当主线程启动时,它不会等待我们创建的另一个线程,直到它们无法使用thread类的联接来等待该线程。因此,基本上,如果子线程或子线程有更多的时间处理任务,而您不使用连接,那么主线程可能会停止。要与主线程保持一致,必须使用联接,以便主线程在仅停止此相关线程后停止 检查此链接
第一种说法不准确。 当所有非守护进程线程都已终止或调用System.exit或Runtime.exit时,java程序将终止 线程退出其运行方法时终止。主线程是特殊的,因为您没有显式地实现它的run方法,而是实现Main,Main从run调用。因此,主线程在主线程终止时终止
但是主线程不一定是最后一个线程 这是JVM规范的第三稿,因此是我所知的最新版本: 5.7虚拟机退出 Java虚拟机在以下任一情况下终止其所有活动并退出: •所有非守护进程线程的线程都会终止。 •一些线程调用类运行时或类系统的exit方法,以及 安全经理允许退出操作
主线程没有区别,所以我们不应该假设它是唯一适用的线程 你能给出这些引用的链接吗?@Steve:它们似乎来自一些相对模糊的Java常见问题解答。你在谷歌上的第一句话准确点击了大约50次。根据《Java2:完整参考》第11章,第277页,最后第二行。这两行是不是应该说thread finished而不是thread Every finished?主线程在到达主线程末端时结束,第二个线程将在到达运行末端时结束。