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. 2018-3-20李宏毅机器学习笔记十----------Logistic Regression
  2. LINQ的Union方法
  3. Unknown SSL protocol error in connection to xxx:443
  4. Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
  5. c++11 std::bind与std::function
  6. pythonweb搭建教程_基于Centos搭建Python Web 环境搭建教程
  7. SLAM--深度滤波器
  8. 三防电子产品美军标MIL-STD-810G
  9. NVIDIA:构建加速计算生态,推动深度学习应用落地
  10. android 获取系统是否允许自动旋转屏幕
  11. 微信公众平台一直限制配置失败-106
  12. 针对三层别墅的两种无线组网方案
  13. 【干货】实例讲解:跨部门沟通和与领导沟通的心得与技巧
  14. 影响蜂糖李苗花芽分化的因素
  15. mysql 免安装版 启动_mysql 免安装版服务启动
  16. Windows下Python安装并为pip配置阿里镜像
  17. 西安电子科技大学计算机刘惠,西安电子科技大学计算机学院硕导介绍:刘惠(2)...
  18. 孟岩:想抓住EOS的机会,从这四个方向入手吧!
  19. 禅道——图文安装及使用教程
  20. Python下进程同步之互斥锁、信号量、事件机制

热门文章

  1. C++ 算法篇 高精度
  2. 你对本届学生会换届候选人有什么意见?请在下面留言
  3. 找准定位是SaaS厂商发展关键
  4. 【最优潮流】基于人工鱼群算法的最优潮流计算(Matlab代码实现)
  5. unity3D游戏开发实战(五)——声音
  6. MySql__为用户赋于主从同步的权限
  7. QLExpress基本语法
  8. 中学生失恋用跳楼割腕来证明真爱
  9. Linux安裝卡巴斯基
  10. 计算机多媒体技术视差估计,面向立体视频的视差_运动同步联立预测算法