java的守护线程和非守护线程区别_java守护线程应用场景

java的守护线程和非守护线程区别_java守护线程应用场景一、守护线程    java分为两种线程:用户线程和守护线程    守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。    守护线程和用户…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、守护线程

        java分为两种线程:用户线程守护线程

        守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

        守护线程和用户线程的基本没什么本质的区别,唯一的不同之处就在于虚拟机的离开。如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

例如: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于
实时监控和管理系统中的可回收资源。

        将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:

  • (1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常,不能把正在运行的       常规线程设置为守护线程。
  • (2) 在Daemon线程中产生的新线程也是Daemon的。
  • (3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

补充说明:
定义:守护线程–也称“服务线程”,在没有用户线程可服务时会自动离开。
优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
设置:通过setDaemon(true)来设置线程为”守护线程”,将一个用户线程设置为守护线程的方式是在线程对象创建之前用线程对               象的setDaemon方法。
生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。Java的守护线程是当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。

二、守护线程使用场景

    守护线程的典型代表是垃圾回收,这是很多人说守护进程非常有用的理由,但实际上守护进程在用户开发上的应用场景几乎用处不大,可能的应用场景:

  • 内存资源或者线程的管理,但是非守护线程也可以做
  • 守护线程负责一个可以将当前的JVM退出的功能,即将非damon的线程都退出,然后jvm自动退出,感觉用的也非常少,可以直接通知相关线程退出不就可以了,考虑设计上优雅一些,可能有点好处。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181799.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Tomcat闪退问题 Tomcat在eclipse运行失败

    Tomcat闪退问题 Tomcat在eclipse运行失败Tomcat原本单独运行没问题,在eclipse里面运行失败后,单独运行也不行了这个方框我看了一晚上,我要看吐了。。。查了很多关于Tomcat闪退的资料,大概分为这几个解决方法:1.环境配置问题2.端口被占用3.直接修改startup.bat和shutdown.bat文件,在前面添加jdk和jre的安装路径…还有很多这些方法随便一搜到处都是我都试过了但是还是没有用…

    2022年5月11日
    47
  • SDN中的LLDP和Openflow协议[通俗易懂]

    SDN中的LLDP和Openflow协议[通俗易懂]OpenFlow交换机把传统网络中,完全由交换机/路由器控制的报文转换为由交换机和控制器来共同完成数据的转发操作,从而实现数据的转发与路由控制的分离。控制器则通过事先规定好的接口操作OpenFlow交换机中的流表,从而达到数据转发的目的。SDN链路发现和拓扑管理主要是控制其利用南向接口的上行通道对底层交换设备上报信息进行统一监控和统计;而策略制定和表项下发则是控制器利用南向接口的下行通道…

    2022年5月11日
    41
  • 零基础学Java(12)静态字段与静态方法

    零基础学Java(12)静态字段与静态方法静态字段与静态方法之前我们都定义的main方法都被标记了static修饰符,那到底是什么意思?下面我们来看看静态字段如果将一个字段定义为static,每个类只有一个这样的字段。而对于非静态的实例

    2022年8月7日
    4
  • AlphAction编译不通过问题:error: command ‘:/home/yst/cudas/cuda-10.0/bin/nvcc‘ failed with exit status 1「建议收藏」

    AlphAction编译不通过问题:error: command ‘:/home/yst/cudas/cuda-10.0/bin/nvcc‘ failed with exit status 1「建议收藏」1.问题描述按照AlphAction官方地址中INSTALL.md一步一步执行,到最后一步pipinstall-e.总是报错,大片红色,换了台工作站还是不行,并且两台报错还不一样。目前已解决问题这台工作站配置是Ubuntu16.04,CUDA=10.0,Pytorch=1.4,使用Anaconda管理环境。完整报错描述:error:command‘:/home/yst/cudas/cuda-10.0/bin/nvcc’failedwithexitstatus1——–

    2022年7月27日
    4
  • 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)——初识WiX

    使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)——初识WiXVisualStudio打包安装七宗罪开发.NET的人,肯定会使用VisualStudio里面自带的MSI打包安装工具框架。如果是在一般情况下,这个打包安装框架已经完全足够满足产品发布安装的需要了。它的制成品,是一个setup.exe,一个MSI安装文件,如果你选择项目以来的其他.

    2022年7月20日
    13
  • eXtremeDB_5noobs

    eXtremeDB_5noobseXtremeDB™ 3.1fromMcObject®ReleaseNotesTargetOS:HP-UX11forPA-RISC,ItaniumHostOS:HP-UX11.xBYUSINGTHISSOFTWAREYOUAGREETOMcObject’s LICENSEAGREEMENT

    2022年10月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号