一、说明

Java中的线程分为两类:一种是守护线程,一种是用户线程。平台我们经常用到的就是用户线程。用户线程和守护线程,从本质上来说并没有什么区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了也就是只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。 Java垃圾回收就是一个典型的守护线程。Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求。若要生成一个守护线程,只需线程在调用start之前,调用setDaemon(true)即可。

二、代码演示

public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {while (true) {if (Thread.currentThread().isInterrupted()) {break;}}log.debug("结束");}, "t1");t1.setDaemon(true);t1.start();Thread.sleep(1000);log.debug("结束");/*** 运行结果:* 22:59:17.456 c.Test15 [main] - 结束*/}

如果t1不是守护线程,那么程序输出【c.Test15 [main] - 结束 】后就一个值循环线程t1中的while循环体,程序也不会停止下来。但是此时t1是守护线程,当主线程执行完后,守护线程立马就终止,所以线程内部的【结束】在整个程序结束后也不会被输出。注意,t1.setDaemon(true);必须在start之前执行,否则就会抛出IllegalThreadStateException异常。这通过setDaemon源码可以很简单的看出来。如果想知道某个线程是否是守护线程则通过isDaemon()方法即可得知。

    public final void setDaemon(boolean on) {//检查checkAccess();//判断线程是否是存活状态,如果是存活状态则抛出异常if (isAlive()) {throw new IllegalThreadStateException();}//Thread 中的成员daemon 设置为ondaemon = on;}public final boolean isDaemon() {return daemon;}

Java多线程之守护线程相关推荐

  1. Java多线程之守护线程实战

    转载自 Java多线程之<<守护线程>>实战 定义 什么是守护线程?与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行完结束之后,守护线程才会跟着结束 ...

  2. JAVA多线程:守护线程 setDaemon全方位剖析| 守护线程是线程吗 |thread.isAlive()反思(五)

    前言 本文目的,通过短小精悍的实例,让你在最短时间,全面揭晓 thread.setDaemon(true)守护线程的使用,及其使用场景.一看就懂,一学就会! 概述 守护线程的作用 用来让其(这里暂称之 ...

  3. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  4. 掌握JAVA多线程的利器-线程池

    为什么80%的码农都做不了架构师?>>>    相信大多数接触过多线程的朋友都会有这样的困惑,明明使用了多线程,为何还是一团糟?用下面两幅图再合适不过了: 理想情况下的多线程VS 现 ...

  5. (转)Java中的守护线程

    Java的守护线程与非守护线程 守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程 ...

  6. java中的守护线程

    在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆: 只要当前JVM实例中尚存 ...

  7. java setdaemon_Java中守护线程的总结 thread.setDaemon(true)

    在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆: 只要当前JVM实例中尚存 ...

  8. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  9. [javaSE] 多线程(守护线程)

    我们一般使用多线程,都是while的死循环,想要结束线程,只需退出死循环即可 当线程中调用了sleep()方法或者wait()方法,当前的线程就会进入冻结状态,这个线程就结束不了 调用Thread对象 ...

最新文章

  1. vim关闭下一行也是注释_10分钟教你为自己打造一个专属VIM
  2. sql delete删除的数据怎么恢复_如何恢复按下Shift + DELETE键永久删除的文件和资料夹?...
  3. Tomcat8.0.11优化相关
  4. 加载如下html 写出输出顺序,浏览器加载和渲染html的顺序-结论篇
  5. 2013 ACM/ICPC Asia Regional Changsha Online - C
  6. docker安装nginx,配置nginx,并成功访问
  7. python矩阵后加点_Python Numpy和矩阵的相关面试问题
  8. myeclipse2014 mysql连接池_MyEclipse配置数据源连接池
  9. 5怎么用修改器_经常用电脑辐射大怎么办?这5个习惯防辐射,很多人都知道
  10. THUPC2019划水记
  11. DenseNet:比ResNet更优的CNN模型
  12. tar命令打包并删除原文件
  13. 国产操作系统(1)UOS安装QT
  14. pytest文档24-fixture的作用范围(scope)
  15. 【业务架构】价值链分析:提高客户价值和盈利能力
  16. Python 字符串格式化
  17. 2019年1月1日之后 你能少缴纳多少个税
  18. 计算机无法更新正在撤销更改,win10更新出现“无法完成更新正在撤销更改请不要关闭计算”怎么办...
  19. 都有哪些语言是跨平台的?
  20. SAP 在表T043G中,XXXX 的输入丢失

热门文章

  1. 2023年哪款杀毒软件最好?
  2. 中国式家长计算机入门怎么去的,中国式家长新手怎么玩 新手快速入门攻略
  3. IOI前四再次被中国包揽!双满分夺金+团体第一,全员保送清华
  4. 2013年第一季度 网游格局
  5. win7 java不是内部或外部命令_Win7系统输入javac命令提示“javac不是内部或外部命令”怎么办...
  6. 赚钱,能治愈一切矫情
  7. xiami flash播放器对歌曲链接的解密算法
  8. 台式机与笔记本的最终选择方案
  9. [DappReview]2020年第二季度Dapp市场报告
  10. “黑马程序员“宣传语有奖大征集