我读到了这句话:
主线程必须是完成执行的最后一个线程。当主线程停止时,程序终止。
是真的吗?
我也开始知道“即使主线程程序继续运行”。
据我所知:当你启动一个程序时,JVM会创建一个线程来运行你的程序。 JVM创建一个用于运行程序的用户线程。该线程称为主线程。从主线程调用类的主要方法。如果程序从主线程生成新线程,它会一直停止,直到最后一个线程死掉。
哪一个是真的?
答案 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方法 安全管理员允许退出操作。
主线程没有区别,所以我们不应该假设它是唯一适用的线程。