浅谈java中守护线程与用户线程
java线程分为两类分别为daemon线程(守护线程)和user线程(用户线程),在jvm启动时候会调用main函数,main函数所在的线程是一个用户线程,这个是我们可以看到的线程,其实jvm内部同时还启动了好多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别那?区别之一是当最后一个非守护线程结束时候,jvm会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响jvm的退出。言外之意是只要有一个用户线程还没结束正常情况下jvm就不会退出。
那么java中如何创建一个守护线程那?代码如下:
public static void main(string[] args) { thread daemonthread = new thread(new runnable() { public void run() { } }); //设置为守护线程 daemonthread.setdaemon(true); daemonthread.start(); }
可知只需要设置线程的daemon参数为true即可。
下面通过例子来加深用户线程与守护线程的区别的理解,首先看下面代码:
public static void main(string[] args) { thread thread = new thread(new runnable() { public void run() { for(;;){} } }); //启动子线 thread.start(); system.out.print("main thread is over"); }
结果输出为:
如上代码在main线程中创建了一个thread线程,thread线程里面是无限循环,运行代码从结果看main线程已经运行结束了,那么jvm进行已经退出了?从ide的输出结果右侧上的红色方块说明jvm进程并没有退出,另外
mac上执行ps -eaf | grep java会输出结果,也可以证明这个结论。
这个结果说明了当父线程结束后,子线程还是可以继续存在的,也就是子线程的生命周期并不受父线程的影响。也说明了当用户线程还存在的情况下jvm进程并不会终止。那么我们把上面的thread线程设置为守护线程后在运行看看会有什么效果:
//设置为守护线程 thread.setdaemon(true); //启动子线 thread.start();
执行结果为:
如上在启动线程前设置线程为守护线程,从输出结果可知jvm进程已经终止了,执行ps -eaf |grep java 也看不到jvm进程了。这个例子里面main函数是唯一的用户线程,thread线程是守护线程,当main线程运行结束后,jvm发现当前已经没有用户线程了,就会终止jvm进程。
java中在main线程运行结束后,jvm会自动启动一个叫做destroyjavavm线程,该线程会等待所有用户线程结束后终止jvm进程,下面通过简单的jvm代码来证明这个结论:
翻开jvm的代码,最终会调用到javamain这个c函数
int jnicall javamain(void * _args) { ... //执行java中的main函数 (*env)->callstaticvoidmethod(env, mainclass, mainid, mainargs); //main函数返回值 ret = (*env)->exceptionoccurred(env) == null ? 0 : 1; //等待所有非守护线程结束,然后销毁jvm进程 leave(); }
leave是c语言里面的一个宏定义,定义如下:
#define leave() \ do { \ if ((*vm)->detachcurrentthread(vm) != jni_ok) { \ jli_reporterrormessage(jvm_error2); \ ret = 1; \ } \ if (jni_true) { \ (*vm)->destroyjavavm(vm); \ return ret; \ } \ } while (jni_false)
上面宏的作用实际是创建了一个名字叫做destroyjavavm的线程来等待所有用户线程结束。
总结:如果你想在主线程结束后jvm进程马上结束,那么创建线程的时候可以设置线程为守护线程,否者如果希望主线程结束后子线程继续工作,等子线程结束后在让jvm进程结束那么就设置子线程为用户线程,开源框架tomcat中就是用了守护线程和用户线程联合运行起来的,具体敬请期待java并发编程基础之并发包源码剖析一书出版。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: java实现微信小程序加密数据解密算法
下一篇: Eclipse设置断点调试的方法