ublic static void main 是在一个非守护线程中运行的,但是JVM中并不一定只有这个非守护线程,你可以在程序中启动多个非守护线程,JVM同样也会等待它们的退出。所以并非主线程(运行main方法的线程)退出就一定退出JVM。
守护线程的唯一用途就是告诉JVM不需要等待它退出,当JVM中所有的线程都是守护线程的时候就可以正常的退出了
普通线程不一样,JVM必须等待它的退出才可以正常的退出。
其实java里面的daemon和linux里面的daemon有很大区别的.linux下面的daemon能够释放控制台,后台运行,java里面的daemon线程就是楼上各位所说的了,只是如果jvm中所有的非daemon线程结束的时候,jvm就退出.
俺原来以为java中的daemon线程可以作到linux中daemon一样的功能,结果不是.java什么时候能实现linux下的daemon那样的操作啊?连dos下面都有内存驻留程序.
如果主线程执行完以后,还有其他非守护线程,程序是不会退出的.
JVM会等待所有非守护线程退出以后才会退出!
public static void main(String[] args) {
new MyThread().start();
//如果MyThread不是守护线程,那么JVM必须等待MyThread退出了才会退出
//并不是退出main函数就已经表示JVM可以结束!
}
有这样的必要吗?在Windows中,你可以运行javaw来达到释放控制台的目的,在Unix下你加&在命令的最后就行了。所以守护进程并非一定需要的。
况且很多程序都是专门写一个服务程序来达到机器启动时启动的,并不需要Java本身实现
Unix下你加&在命令的最后就行了?
这点不同意,而且还有很多问题.
加了&,只是放后台执行而已,控制台没有释放.
而且,作为一个后台进行,怎么去结束?不能每次都kill吧?
服务程序总要有点服务程序的样子,要不然unix下面也不会费那么大劲做一个daemon来了.