假设我在其主要方法中运行了一个运行Thread的Java应用程序。
在main方法中的所有代码执行完毕之后。应用程序是否会等待线程直到它完成执行,否则它将终止应用程序和JVM。
答案 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)
。