首页 > 编程知识 正文

java 终止线程,线程需要守护吗

时间:2023-05-03 17:15:43 阅读:34941 作者:4204

如何在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中创建守护程序线程的方法,您学到过知识和技能吗? 如果想掌握更多技能或丰富自己的知识,请关注亿速云行业的信息渠道。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。