主线程何时在Java中停止?

时间:2011-09-14 12:04:13

标签: java multithreading jvm

我读到了这句话:

  

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

是真的吗?

我也开始知道“即使主线程程序继续运行”。

据我所知:当你启动一个程序时,JVM会创建一个线程来运行你的程序。 JVM创建一个用于运行程序的用户线程。该线程称为主线程。从主线程调用类的主要方法。如果程序从主线程生成新线程,它会一直停止,直到最后一个线程死掉。

哪一个是真的?

7 个答案:

答案 0 :(得分:20)

程序在所有非守护程序线程死亡时终止(守护程序线程是标有setDaemon(true)的线程;它通常用于实用程序线程)。来自javadoc

  

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

     
      
  • 已调用类Runtime的exit方法,并且安全管理器已允许执行退出操作。
  •   
  • 所有非守护程序线程的线程都已死亡,无论是通过从run方法调用返回还是抛出传播超出run方法的异常。
  •   

答案 1 :(得分:14)

  

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

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

简单示例:

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

答案 2 :(得分:3)

  

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

当不再运行任何非守护程序线程(或称为System.exit的人)时,程序终止。主线程很久以前就已经完成了。

答案 3 :(得分:3)

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

创建新线程时,可以调用Thread.setDaemon(true)使其成为守护程序线程。如果这样做,那么JVM将不会等到该线程在执行之前完成。这对于您创建的任何线程非常有用,这些线程将在后台运行,直到程序停止。

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

答案 4 :(得分:1)

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

检查此链接

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

答案 5 :(得分:1)

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

线程退出其run()方法时终止。主线程是特殊的,因为您没有明确实现其run()方法,而是实现main(),而main()则来自run()。因此,当main()终止时,主线程终止。

但主要线程不是最后一个。

答案 6 :(得分:0)

这是来自JVM规范的第3版草案,因此它是我所知道的最新版本:

5.7虚拟机退出

Java虚拟机会终止其所有活动,并在以下任一情况下退出:    •所有非守护程序线程的线程终止。    •某些线程调用Runtime类或类System的exit方法    安全管理员允许退出操作。

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