如何在java中创建守护程序线程
发布时间: 2020-12-08 15:45:04
来源:亿速云
阅读: 64
作者: Leah
本文介绍了如何在java中创建守护程序线程。 内容简洁易懂,能让眼前一亮。 希望通过对这篇文章的详细介绍,你能得到。
Java线程分为守护程序线程和用户线程,在JVM启动时调用main函数。 main函数所在的线程是用户线程,这是可见的线程。 实际上,JVM内部还同时启动了许多守护程序线程,如垃圾回收线程。 那么守护程序线程和用户线程有什么区别? 一个区别是,当最后一个非守护程序线程终止时,无论当前是否存在守护程序线程,即守护程序线程是否终止,JVM都将成功终止。 意外的意思是,只要一个用户线程没有终止,JVM就不会终止。
如何创建守护程序线程:
publicstaticvoidmain (字符串[ ] args ) {
threaddaemonthread=new thread (new runnable () )。
公共void run (}
}
);
//设为守护程序线程
daemonthread.setdaemon(true;
daemonThread.start (;
}
您可以看到,将线程的daemon参数设置为true即可。
要了解用户线程和守护程序线程之间的区别,请首先查看以下代码:
publicstaticvoidmain (字符串[ ] args ) {
thread thread=new thread (new runnable () )。
公共void run (}
for (; () )
}
);
//启动子线
thread.start (;
system.out.print (mainthreadisover );
}
结果如下。
如上所示,代码在主线程上创建了thread线程。 thread线程中有无限循环,运行代码时,结果显示主线程已终止运行。 那么,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中,当主线程运行结束时,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语言的宏定义,定义如下:
#定义级别(() ) ) ) )
do {
if ()虚拟机(-detachcurrentthread ) )虚拟机!=JNI_OK ) {
jli _ report error message (JVM _ error 2;
ret=1;
() )。
if(jni_true () () () ) ) )
(虚拟机)-destroyjavavm ) )虚拟机;
返回ret;
() )。
}是}while(jni_false )
以上是在java中创建守护程序线程的方法,您学到过知识和技能吗? 如果想掌握更多技能或丰富自己的知识,请关注亿速云行业的信息渠道。