3

假设我创建了一个 Java 应用程序,它的 main 方法中运行了一个线程。

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

4

3 回答 3

7

java.lang.Thread文档:

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

  • 已调用 Runtime 类的退出方法,并且安全管理器已允许进行退出操作。
  • 所有不是守护线程的线程都已经死亡,要么通过调用 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!");
    }

}
于 2013-03-27T08:15:36.663 回答
1

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

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

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

于 2013-03-27T08:09:47.333 回答
1

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

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

于 2013-03-27T08:20:39.243 回答