网上对Java的Daemon线程的说法很多,看的人头晕。

所以自己就来总结一下:

Java语言自己可以创建两种进程“用户线程”和“守护线程”

用户线程:就是我们平时创建的普通线程.

守护线程:主要是用来服务用户线程.

那么如何来区分这两种线程呢?

其实在JDK的文档中已经说明的很清楚了:

* The Java Virtual Machine exits when the only threads running are all

* daemon threads.

即:

当线程只剩下守护线程的时候,JVM就会退出.但是如果还有其他的任意一个用户线程还在,JVM就不会退出.

下面我们用实验来说明,当线程只剩下守护线程的时候,JVM就会退出.

代码如下:

public class DaemonRunner implements Runnable {

public void run() {

while (true) {

for (int i = 1; i <= 100; i++) {

System.out.println(i);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

Thread daemonThread = new Thread(new DaemonRunner());

// 设置为守护进程

daemonThread.setDaemon(true);

daemonThread.start();

System.out.println("isDaemon = " + daemonThread.isDaemon());

Scanner scanner = new Scanner(System.in);

// 接受输入,使程序在此停顿,一旦接受到用户输入,main线程结束,JVM退出!

scanner.next();

//AddShutdownHook方法增加JVM停止时要做处理事件:

//当JVM退出时,打印JVM Exit语句.

Runtime.getRuntime().addShutdownHook(new Thread(){

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("JVM Exit!");

}

});

}

}

当程序运行的时候,Daemon线程会不断的在控制台打印数字,而main线程是一个用户线程由于”scanner.next()”

等待用户输入,属于阻塞了.此时JVM当然不会退出.

验证步骤:

这个时候只要我们确定当前用户线程只有一个,即只要main线程退出,然后检查JVM是否真的退出了。

那么我们如何确定当前的JVM虚拟机中的,当前的用户线程和daemon有多少呢?

我们可以用JDK中自带的查看堆栈工具jstack.

jstack 3308(即当前要探测的JVM进程的进程ID)

得到结果如下:

我们会看到当前JVM进程中跑着很多线程,但是只有main线程是用户线程,其他线程要不是daemon线程(如Low Memory Detector或Thread-0),要不就是虚拟机内部线程(如VM Thread 和VM Periodic Task Thread,这些线程我们不用考虑).

因此当用户线程main线程退出时(在本程序中,在控制台输入一个字符然后回车),如果JVM确实退出了的话,会调用ShutDownHook在控制台上打印“JVM Exit!.”

如果没有退出的话,当然就不会打印了.

验证结果:

控制台成功打印“JVM Exit!”,JVM退出!

java daemon 线程_【转】关于Java的Daemon线程的理解相关推荐

  1. java守护线程与用户线程_详解Java线程-守护线程与用户线程

    干java 开发这么多年, 之前一直没留意java 进程还区分守护进程和用户进程.守护进程这个概念最早还是在linux系统中接触的,直到近期使用java开发心跳检测功能时,使用Timer时才发现原来j ...

  2. java 内存排序_详细解析Java内存,处理器重排序,编译器重排序以及它对线程的影响...

    欢迎大家搜索"小猴子的技术笔记"关注我的公众号,有问题可以及时和我交流. 我们在编写程序的时候有一个编写代码的顺序,那么计算机执行的时候就是按照我们编写代码的顺序来执行的吗?答案是 ...

  3. 能跑java的服务器_一台java服务器可以跑多少个线程?

    一台java服务器能跑多少个线程?这个问题来自一次线上报警如下图,超过了我们的配置阈值. 京东自研UMP监控分析 打出jstack文件,通过IBM Thread and Monitor Dump An ...

  4. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

    java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...

  5. java 异常处理线程_转:Java子线程中的异常处理(通用)

    在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相 ...

  6. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  7. java任务流程_死磕 java线程系列之线程池深入解析——普通任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了Java中 ...

  8. java 多线程 张孝祥_多线程11_张孝祥 java5的线程锁技术

    本例子因为两个线程公用同线程中,使用同一个对象,实现了他们公用一把锁,实现了同一个方法的互斥. package locks; /** *会被打乱的效果 */ public class LockTest ...

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

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

  10. java归还线程_再谈java线程

    什么是等待唤醒机制? 这是多个线程间的一种协作机制. 就是一个线程进行规定协作后,就进入到了等待状态'wait()',等待其他线程执行完他们的指定代码后,再将其唤醒'notify()'; 在有多个线程 ...

最新文章

  1. 深度学习的多个loss如何平衡?
  2. lm-sensors工具安装和使用
  3. Linux内核设计基础(一)之中断处理
  4. java实现下载时进度条提示
  5. toString()
  6. 【15】docker
  7. 给一个div innerhtml 后 没有内容显示的问题_实战:仅用18行JavaScript构建一个倒数计时器...
  8. JDBC05 ResultSet结果集
  9. ispalpha函数与islower
  10. 一步步的Abaqus2021版本安装教程+汉化操作
  11. android 蓝牙 发送字符串,Android向TLSR8266蓝牙mesh发送指令
  12. 细分领域:偏门的色流玩法+简单的色流变现套路
  13. 用云原生的思维践行云原生,一切皆服务
  14. 文章图片配色怎么选?
  15. 根据浏览器的默认语言来切换中英文页面
  16. 谷歌浏览器播放器声音
  17. cobar mysql部署方案_Cobar的安装和配置步骤
  18. 软件 黑苹果盒盖不休眠_怎么解决苹果电脑合盖自动休眠问题?
  19. 留学生把“中国牛排”臭豆腐带到国外,18家连锁店开遍澳洲
  20. 舒尔特方格训练注意力游戏 | 舒尔特Pro

热门文章

  1. php代码连接mysql数据库,php连接mysql数据库代码
  2. 计算指数函数的和的对数
  3. Spark Master资源调度--worker向master注册
  4. thing php官网,Thinkphp5企业官网,php后台管理框架
  5. fopen /open,read/write和fread/fwrite区别
  6. kittito_rosbag入坑教程
  7. 为何网站天天更新收录还是那么慢吗
  8. android camera 显示过程,Android相机Camera基础知识
  9. 耿国华c语言程序设计,C语言程序设计课程教学探究.doc
  10. php登录注册案例,php实现登陆与注册的案例