Java中线程分为用户线程(user thread)和守护线程(daemon thread),它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程。
  一个Thread初始默认为用户线程(daemon默认为false),创建Thread的时候默认从当前线程"继承"daemon属性,见Thread.init方法:

Thread parent = currentThread();
this.daemon = parent.isDaemon();

  当虚拟机中剩余运行的都是守护线程时,JVM会退出;只要存在至少一个用户线程,JVM就不会退出。可以在Thread.start之前调用Thread.setDaemon方法设置线程属性(用户线程/守护线程)。
  只能在Thread未开始运行之前设置daemon属性,如果Thread已经开始运行,再设置daemon会抛出IllegalThreadStateException异常,见Thread.setDaemon方法:

public final void setDaemon(boolean on) {checkAccess();if (isAlive()) {throw new IllegalThreadStateException();}daemon = on;}

  例1:thread是用户线程,主线程结束后,thread会继续运行

public static void main(String[] args) throws Exception {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000L);System.out.println("still running.");} catch (InterruptedException e) {e.printStackTrace();}}}});//设置线程为用户线程thread.setDaemon(false);thread.start();Thread.sleep(3000L);System.out.println("主线程退出");}//输出
still running.
still running.
主线程退出
still running.
still running.
still running.
still running.

  例2:thread是守护线程,主线程结束后,thread会随即停止

    public static void main(String[] args) throws Exception {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000L);System.out.println("still running.");} catch (InterruptedException e) {e.printStackTrace();}}}});//设置线程为守护线程thread.setDaemon(true);thread.start();Thread.sleep(3000L);System.out.println("主线程退出");}//输出
still running.
still running.
主线程退出

  GC线程就是一个守护线程,保持低优先级进行垃圾回收,不依赖系统资源,当所有用户线程退出之后,GC线程也就没有什么用了,会随即退出。因为如果没有用户线程了,也就代表没有垃圾会继续产生,也就不需要GC线程了。
  可以简单理解成守护线程为用户线程服务,当所有用户线程结束,也就不需要守护线程了。

Thread.setDaemon设置守护线程相关推荐

  1. Thread.setDaemon设置说明

    Thread.setDaemon的用法,经过学习以后了解: 1. setDaemon需要在start方法调用之前使用 2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为 ...

  2. 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程

    立即学习:https://edu.csdn.net/course/play/24458/296440?utm_source=blogtoedu 1.Thread其他的属性 CurrentThread( ...

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

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

  4. 多线程之守护线程daemonVS用户线程

    线程分为守护线程和用户线程:系统默认的用户线程是主线程: 虚拟机中监控内存,垃圾回收等待,日志管理等都属于守护线程,一般默认不显示在控制台,默认false,虚拟机不用等待守护线程执行完毕:守护线程理论 ...

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

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

  6. JAVA - 守护线程(Daemon Thread)

    转载自:http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html 在Java中有两类线程:用户线程 (User Thread) ...

  7. setDaemon python守护进程,队列通信子线程

    使用setDaemon()和守护线程这方面知识有关, 比如在启动线程前设置thread.setDaemon(True),就是设置该线程为守护线程, 表示该线程是不重要的,进程退出时不需要等待这个线程执 ...

  8. java setdaemon_java教程--守护线程setDaemon

    守护线程setDaemon 守护线程: 为用户线程进行服务的线程.当所有的用户线程都执行结束以后无论守护线程的线程体是否执行完,守护线程都会结束 设置守护线程 void (boolean on)将该线 ...

  9. Thread守护线程判断每位员工是否可以下班,要求员工时间大于或等于8小时才能够下班

    设置守护线程判断每位员工是否可以下班,要求员工时间大于或等于8小时才能够下班 package com.tw.thread;import lombok.SneakyThrows; import java ...

最新文章

  1. MapReduce的统计和排序功能
  2. php序列化中文,详解之php反序列化
  3. Ubuntu 16.04下减小/释放/清理VirtualBox虚拟硬盘文件的大小
  4. eclipse 创建maven web项目_Eclipse创建第一个Scala项目(过程)
  5. docker swarm的应用----docker集群的构建
  6. ajax获取jsp对象,如何用Ajax传递一个对象集合到jsp页面。
  7. C/C++的ide编译器CLion的安装及快捷键使用
  8. B/S开发框架Web安全问题及防范规范之挂马和WebShell
  9. Kotlint集合简单总结
  10. 计算机专业技术面试题
  11. js 实现文件上传 php,JS+php后台实现文件上传功能详解
  12. ​力扣解法汇总904.水果成篮
  13. 快速定位线上慢 SQL 问题,掌握这几个性能排查工具可助你一臂之力
  14. supermap 数据转为shp
  15. vuex总结(完整版)(亲测)
  16. 东师理想运维工具开发路线图(第一阶段)
  17. java从入门到精通API02
  18. JAVA毕业设计宠物店管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  19. 利用Github Pages创建Hexo博客
  20. 设计模式(八):装饰模式

热门文章

  1. ArrayBlockingQueue的put和take过程详解
  2. 回望即将过去的2018年,展望即将到来的2019年
  3. 深度解析某头条的一道TopN面试题
  4. ubuntu16.04 系统分区与安装
  5. linux oracle em配置,Oracle11g在Linux下手工配置EM
  6. 标志设计四大禁忌(翻译理论)
  7. ROHM常见的电冰箱控制电路图,轻松了解冰箱工作原理
  8. easyui表格数据折叠的使用经验
  9. 计算机专业申请ps怎么写,【PS范文】— 非大牛录取卡耐基梅陇(CMU)计算机硕士的PS分享...
  10. glance制作Linux镜像,在线升级glance镜像技巧