博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Java的Daemon线程的理解
阅读量:4568 次
发布时间:2019-06-08

本文共 1929 字,大约阅读时间需要 6 分钟。

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

所以自己就来总结一下:

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

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

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

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

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

* The Java Virtual Machine exits when the only threads running are all * daemon threads.
即:
 
 
下面我们用实验来说明,当线程只剩下守护线程的时候,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退出!

转载于:https://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html

你可能感兴趣的文章
Android仿腾讯应用宝 应用市场,下载界面, 有了进展button
查看>>
安卓|五大逆向软件下载
查看>>
5 OK6410裸机调试(不用Jlink)
查看>>
“模板”学习笔记(5)-----编译器在处理函数模板的时候都干了啥
查看>>
教你用shell写CGI程序
查看>>
窗口 对话框 Pop Dialog 示例
查看>>
ubuntu(centos) server安装vmware tools
查看>>
数据结构之最大不重复串
查看>>
为什么要配置sdk-tools/platform-toools?
查看>>
自己动手开发更好用的markdown编辑器-07(扩展语法)
查看>>
maven dependency:tree中反斜杠的含义
查看>>
队列的循环队列
查看>>
程序中的日期格式
查看>>
大众点评CAT错误总结以及解决思路
查看>>
从0开始学爬虫3之xpath的介绍和使用
查看>>
Shell成长之路
查看>>
vim下正则表达式的非贪婪匹配
查看>>
一个python的计算熵(entropy)的函数
查看>>
spring源码学习——spring整体架构和设计理念
查看>>
模拟window系统的“回收站”
查看>>