主线程何时停止在Java中?
我读了这个声明:
主线程必须是完成执行的最后一个线程。 当主线程停止时,程序终止。
这是真的吗?
我也来了解“即使主线程序死机程序继续运行”。
据我的理解:当你启动一个程序,JVM创build一个线程来运行你的程序。 JVM创build一个用于运行程序的用户线程。 这个线程被称为主线程。 该类的主要方法是从主线程调用。 如果程序从主线程产生新的线程,它会停止,直到最后一个线程死亡。
哪一个是真的?
当所有非守护进程线程死亡时,程序终止(守护进程线程是一个标有setDaemon(true)
的线程setDaemon(true)
;它通常用于工具线程)。 来自javadoc :
当Java虚拟机启动时,通常有一个非守护线程(通常调用一些指定类的main方法)。 Java虚拟机继续执行线程,直到出现以下任一情况:
- 类Runtime的退出方法已经被调用,并且安全pipe理器已经允许退出操作发生。
- 所有不是守护线程的线程都已经死了,要么从调用返回到run方法,要么抛出一个超出run方法的exception。
我读这个语句:“主线程必须是最后一个线程才能完成执行。 当主线程停止时,程序终止。“是真的吗?
不它不是。 如果最后一个非后台线程完成,虚拟机将终止。 它不一定是主线程。
简单的例子:
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"); }
当主线程停止时,程序终止。
当程序不再有任何非守护线程运行时(或者有人叫做System.exit),程序终止。 主线程可以在很久以前完成。
当主线程和所有非守护线程完成执行时,JVM将退出。
当你创build一个新的线程时,你可以调用Thread.setDaemon(true)
使它成为一个守护线程。 如果你这样做,那么JVM就不会等到这个线程在执行之前完成。 这对你创build的任何线程都是有用的,这些线程在程序停止之前在后台运行。
如果创build了一个新的线程并且不调用Thread.setDaemon(true)
,那么即使主线程完成,JVM也会延迟退出直到该线程完成。
当主线程启动时,它不会等待我们创build的另一个线程,直到它们不能使用线程类的join()来等待这个线程。 所以基本上如果子线程或子线程获得更多的时间来处理任务,你不使用join(),那么主线程可能会停止。 要保持与主线程,你必须使用join(),所以主线程停止后,只有相关的线程停止
检查这个链接
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join%28%29
第一个陈述并不准确。 当所有非守护进程线程被终止或调用System.exit()
或Runtime.exit()
时,java程序终止。
线程在退出run()
方法时被终止。 主线程是特殊的,因为你没有明确地实现它的run()
方法,而是实现main()
而main()
是从run()
调用的。 所以,当main()
被终止时,主线程被终止。
但主线不是最后一个。
这是来自JVM规范第三稿,所以这是我所知道的最新的:
5.7虚拟机退出
Java虚拟机将终止其所有活动并在以下情况下退出:• 不是守护进程线程的所有线程均终止。 有些线程调用Runtime类或System类的exit方法,安全pipe理器允许退出操作。
主线程没有区别,所以我们不应该认为它是唯一适用的。
- 如何在jPanel中绘制? (swing / graphics Java)
- 为什么只有1个公共类在Java文件中
- 什么是URLConnection.setDoOutput()影响?
- 我可以用Java / Groovy以编程方式更改我的Windows桌面墙纸吗?
- JTable getSelectedRow不返回选定的行索引
- 什么是泛化generics? 他们如何解决types擦除问题,为什么不能添加没有重大变化?
- 如果它像compareAndSet一样实现,weakCompareAndSet如何虚假地失败?
- Mockito – doReturn()和when()之间的区别
- 什么时候最好在Java中使用volatile布尔值而不是AtomicBoolean?