全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈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  # 守护线程  # 用户线程  # Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例  # Python网络编程基于多线程实现多用户全双工聊天功能示例  # 详解Java线程-守护线程与用户线程  # 详解Linux用户态与内核态通信的几种方式  # JAVA模拟多线程给多用户发送短信  # 用户态和内核态-用户线程和内核态线程的区别  # 结束后  # 设置为  # 是一个  # 情况下  # 就会  # 还没  # 出了  # 言外之意  # 一是  # 你想  # 用了  # 不受  # 可以看到  # 只需要  # 分别为  # 说明了  # 也说  # 也看  # 一书  # 两类 


相关文章: 建站之星展会模版如何一键下载生成?  海南网站制作公司有哪些,海口网是哪家的?  红河网站制作公司,红河事业单位身份证如何上传?  如何在服务器上三步完成建站并提升流量?  网站制作话术技巧,网站推广做的好怎么话术?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  网站代码制作软件有哪些,如何生成自己网站的代码?  ,购物网站怎么盈利呢?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何通过虚拟机搭建网站?详细步骤解析  建站主机选哪家性价比最高?  平台云上自助建站如何快速打造专业网站?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  行程制作网站有哪些,第三方机票电子行程单怎么开?  Swift中循环语句中的转移语句 break 和 continue  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何用VPS主机快速搭建个人网站?  建站之星北京办公室:智能建站系统与小程序生成方案解析  c# await 一个已经完成的Task会发生什么  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  购物网站制作公司有哪些,哪个购物网站比较好?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  微信小程序 五星评分(包括半颗星评分)实例代码  如何选择CMS系统实现快速建站与SEO优化?  如何用搬瓦工VPS快速搭建个人网站?  建站之星24小时客服电话如何获取?  建站主机默认首页配置指南:核心功能与访问路径优化  如何快速建站并高效导出源代码?  已有域名能否直接搭建网站?  如何通过老薛主机一键快速建站?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  招贴海报怎么做,什么是海报招贴?  如何通过NAT技术实现内网高效建站?  如何快速搭建高效香港服务器网站?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  c# 在ASP.NET Core中管理和取消后台任务  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  建站之星后台密码遗忘如何找回?  如何在阿里云部署织梦网站?  免费网站制作appp,免费制作app哪个平台好?  如何通过VPS建站无需域名直接访问?  建站之星代理商如何保障技术支持与售后服务?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。