Application主方法在终止之前是否等待Threads

时间:2013-03-27 08:07:44

标签: java

假设我在其主要方法中运行了一个运行Thread的Java应用程序。

在main方法中的所有代码执行完毕之后。应用程序是否会等待线程直到它完成执行,否则它将终止应用程序和JVM。

3 个答案:

答案 0 :(得分:6)

来自java.lang.Thread文档:

  

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

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

所以,是的,它会等待,但不会被标记为守护程序线程的线程。

您可以看到它使用以下代码:

public class ThreadTest {

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("I'm still here!");
            }
        });
        // uncomment following line to test with daemon thread
        //thread.setDaemon(true);
        thread.start();

        System.out.println("Finished!");
    }

}

答案 1 :(得分:1)

  

应用程序是否会等待线程,直到它完成执行

是的,无论主线程是否完全执行,它都会等待执行子线程。

它不会等待守护程序线程。如果线程通过调用Thread.setDaemon(true);

设置为守护程序线程

答案 2 :(得分:1)

它取决于启动的线程是什么类型的线程。当运行的唯一线程都是守护程序线程时,JVM退出。

默认情况下,线程不是守护程序线程。要使线程成为守护程序线程,请在启动之前调用Thread.setDaemon(true)