守护线程是一种支持性线程,主要用于后台调度以及支持性的工作。守护线程具备自动结束生命周期的特性,而非守护线程则不具备。如果对上面的概念一知半解的话,我们先来看一个简单的例子,明白守护线程的执行情况:

public class MyDaemon implements Runnable {    @Override    public void run() {        System.out.println("********守护线程********");    }}
public class MyDaemonTest {    public static void main(String[] args) {        Thread thread = new Thread(new MyDaemon(), "守护线程");        thread.setDaemon(true);        thread.start();        System.out.println("******main线程执行结束******");    }}

请猜测一下上面的执行结果,如果多次执行就会发现,运行的结果会有两种情况。第一种情况最容易出现,第二种情况在多次运行上面的程序之后偶尔会出现。

******main线程执行结束******
******main线程执行结束**************守护进程********

这里如果不明白守护进程的真正意义就会存在疑问,为什么会出现上面的两种情况呢?这里我根据这个例子再次解释下文章开头对守护线程的描述。

首先一个线程的运行肯定是由另外一个线程启动的,在上面的例子中我们运行了“main()”方法,也就是启动了一个主线程。然后“main()”方法中调用了我们自定义的线程“MyDaemon()”,之后我们给“MyDaemon()”这个线程设置成为了守护进程。守护进程有个特点就是当所有非守护线程都运行结束时,JVM退出,进程结束。我来画个图给大家解释一下这句话的意思。

为了验证上述的表达,我们在将之前的“MyDaemon()”进行一下修改,然后对比一下结果:

public class MyDaemon implements Runnable {    @Override    public void run() {        while (true) {            System.out.println("********守护进程********");        }    }}

把“MyDaemonTest()”中的守护进程设置为false。

public class MyDaemonTest {    public static void main(String[] args) {        Thread thread = new Thread(new MyDaemon(), "守护进程");        thread.setDaemon(false);        thread.start();        System.out.println("******main线程执行结束******");    }}

这个线程运行之后的执行结果是“MyDaemon()”中的内容一致循环不断地输出,JVM不会退出。

我们再来对比下面这个稍微改动的程序,只需要把上述的“thread.setDaemon(false)”修改成“thread.setDaemon(true)”即可:

public class MyDaemonTest {    public static void main(String[] args) {        Thread thread = new Thread(new MyDaemon(), "守护进程");        thread.setDaemon(true);        thread.start();        System.out.println("******main线程执行结束******");    }}

这次运行结果是JVM可以自动退出。

假如在主要线程运行的时候,你还想让一个不太重要的线程执行任务,但是又想等主要线程退出时不太重要的线程也立刻结束。或许你想到了使用中断的方式,但是如果将不太重要的线程设置为守护进程使用则更加简单。

注意:在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源 的逻辑,因为它有可能没有被执行就已经退出了。

线程自动退出_什么是Java的守护线程?相关推荐

  1. java中什么是守护线程_什么是Java的守护线程?

    欢迎大家搜索"小猴子的技术笔记"关注我的公众号,有问题可以及时和我交流. 守护线程是一种支持性线程,主要用于后台调度以及支持性的工作.守护线程具备自动结束生命周期的特性,而非守护线 ...

  2. java线程提高速度_如何在JAVA中减慢线程速度

    我有这个类,我在其中运行10次for循环.该类实现了Runnable接口.现在在main()中我创建了2个线程.现在两个都将循环运行到10.但我想检查每个线程的循环计数.如果t1超过7,则让它休眠1秒 ...

  3. java如何写线程外部类_廖雪峰Java读书笔记(六)--多线程(或称并发)

    1. 多线程基础 首先要明白一些概念: 进程:把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程. 线程:某些进程内部还需要同时执行多个子任务.例 ...

  4. executor线程池框架_如何使用Java 5 Executor框架创建线程池

    executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...

  5. Java的守护线程和非守护线程

    一.守护线程 java分为两种线程:用户线程和守护线程 守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因此 ...

  6. Java多线程—守护线程

    运行在程序后台的一个特殊的线程 当程序只剩下守护线程的时候,守护线程会自动退出 守护线程不能持有任何需要关闭的资源,例如打开文件等,因为虚拟机退出时,守护线程没有任何机会来关闭文件,这会导致数据丢失. ...

  7. Java的守护线程Daemon

    守护线程与非守护线程 所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因 此,当所有的非守护线程结束时, ...

  8. 查看java线程是否退出_[原创]IDA调试阻止java线程异常退出

    IDA调试阻止java线程异常退出 最近在使用IDA调试分析某款产品遇见了一个头痛的问题,因为程序核心功能在native层实现的,所以主要的侧重点是分析so文件,但是在分析的时候总是出现java线程异 ...

  9. java线程轮询_基于springboot实现轮询线程自动执行任务

    本文使用: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行, 但不能在指定 ...

最新文章

  1. php关于路由,PHP URL路由类实例
  2. 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)
  3. java final 变量 回收_在Java中将final用于变量会改善垃圾回收吗?
  4. 2259: matrix
  5. java 文件下载方法_【工具类】Java后台上传下载文件的几种方式
  6. Nhibernate+MVC开发日志
  7. php通过js发送请求数据,使用原生javascript发送ajax请求数据的步骤
  8. android 时间计划软件,时间规划局专业版
  9. sqlerver 字符串转整型_sqlerver2005(2)
  10. 使用RESIZE方法解决临时表空间(TEMP)过大问题
  11. python调用按键精灵插件_按键精灵教程打码平台接入
  12. Git版本控制管理(一)--安装
  13. 科创板在6月的这30天:方邦电子等31家过会并提交注册 新受理28家
  14. 计算机桌面图标底纹,怎样去除桌面图标下的底色[XP系统]【图文教程】
  15. 运放的 零点和极点快速找到
  16. C++ 域名转IP地址
  17. Keras框架下的loss损失函数
  18. 打开心灵之窗 与心灵对话
  19. uni-simple-router 注意事项
  20. 工作常用软件(整理)

热门文章

  1. SAP CRM IBASE头部字段valid from和valid to的填充逻辑
  2. IDOC generation debug for One Order
  3. 使用代码自动打开ABAP Editor
  4. Error message Exception raised without specific error
  5. SAP CRM HANA live report的数据源
  6. 如何在腾讯云上安装Cloud Foundry
  7. 管理信息系统属于计算机的什么应用领域,全国2013自考《管理系统中计算机应用》...
  8. 服务器装win10系统文档,Win10系统安装远程服务器管理的技巧
  9. java扫雷具有win7_Win7系统自带扫雷游戏打不开的解决方法
  10. easyswoole和mixphp_swoole框架都有哪些