Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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 - Fatal编程技术网

Java 应用程序主方法是否在终止前等待线程

Java 应用程序主方法是否在终止前等待线程,java,Java,假设我是一个Java应用程序,它的主方法中运行着一个线程 在执行主方法中的所有代码之后。应用程序会等待线程直到它完成执行,还是仅仅终止应用程序和JVM 应用程序会等待线程直到它完成执行吗 是的,无论主线程是否完全执行,它都将等待子线程的执行完成 它不会等待守护进程线程。如果通过调用thread.setDaemon(true)将线程设置为守护进程线程来自文档: 当Java虚拟机启动时,通常只有一个 非守护进程线程(通常调用某些 指定类别)。Java虚拟机继续执行 线程,直到发生以下任一情况: 类

假设我是一个Java应用程序,它的主方法中运行着一个线程

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

应用程序会等待线程直到它完成执行吗

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

它不会等待守护进程线程。如果通过调用
thread.setDaemon(true)将线程设置为守护进程线程

来自文档:

当Java虚拟机启动时,通常只有一个 非守护进程线程(通常调用某些 指定类别)。Java虚拟机继续执行 线程,直到发生以下任一情况:

  • 类运行时的exit方法已被调用,并且安全管理器已允许执行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!");
    }

}

这取决于启动线程的类型。当运行的线程都是守护进程线程时,JVM退出


默认情况下,线程不是守护进程线程。要使线程成为守护进程线程,请在启动之前调用。

我建议您尝试一下。