Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的主线程何时停止?_Java_Multithreading_Jvm - Fatal编程技术网

Java中的主线程何时停止?

Java中的主线程何时停止?,java,multithreading,jvm,Java,Multithreading,Jvm,我宣读了这项声明: 主线程必须是完成执行的最后一个线程。当主线程停止时,程序终止 这是真的吗 我也知道即使主线程死了,程序也会继续运行 这是我目前的理解: 启动程序时,JVM会创建一个线程来运行程序。 JVM为运行程序创建一个用户线程。这个线程称为主线程。 类的main方法是从主线程调用的。 如果程序从主线程生成新线程,则程序将等待直到最后一个线程死亡。 哪一个是真的?当所有非守护进程线程死亡时,程序终止。守护进程线程是标记为setDaemontrue的线程;它通常用于实用程序线程。从: 当Ja

我宣读了这项声明:

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

这是真的吗

我也知道即使主线程死了,程序也会继续运行

这是我目前的理解:

启动程序时,JVM会创建一个线程来运行程序。 JVM为运行程序创建一个用户线程。这个线程称为主线程。 类的main方法是从主线程调用的。 如果程序从主线程生成新线程,则程序将等待直到最后一个线程死亡。
哪一个是真的?

当所有非守护进程线程死亡时,程序终止。守护进程线程是标记为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?主线程在到达主线程末端时结束,第二个线程将在到达运行末端时结束。