原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html

关于Java的Daemon线程的理解

网上对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线程的理解的更多相关文章

  1. JAVA DAEMON线程的理解

    java线程分两种:用户线程和daemon线程.daemon线程或进程就是守护线程或者进程,但是java中所说的daemon线程和linux中的daemon是有一点区别的. linux中的daemon ...

  2. java concurrency: daemon线程

    daemon线程的概念 在学习操作系统概念的时候,我们就曾听说过daemon的概念.daemon本身指的是在后台运行的进程或者线程,一般用来提供某些不需要与用户直接交互的服务,有点像我们见到的一些系统 ...

  3. JAVA 对守护线程的理解

    1.在start之前,setDaemon. 该现场就成为守护线程了. 2.守护现线程并不是主线程结束,子线程(守护线程)也跟着结束.而是守护线程在没有用户线程运行的情况伴随着JVM退出而结束. 示例代 ...

  4. java线程基础知识----java daemon线程

    java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...

  5. java线程安全理解

    java线程安全理解 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. ...

  6. [译]线程生命周期-理解Java中的线程状态

    线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...

  7. Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。

    java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...

  8. Java中的线程池用过吧?来说说你是怎么理解线程池吧?

    前言 Java中的线程池用过吧?来说说你是怎么使用线程池的?这句话在面试过程中遇到过好几次了.我甚至这次标题都想写成[Java八股文之线程池],但是有点太俗套了.虽然,线程池是一个已经被说烂的知识点了 ...

  9. Java 学习笔记之 Daemon线程

    Daemon线程: 线程: 用户线程 守护线程 守护线程是一种特殊的线程,在进程中不存在非守护线程了,则守护线程自动销毁. public class DaemonThread extends Thre ...

随机推荐

  1. Angularjs CURD

    前言 基于一个手机端的项目使用了angularjs,硬着头皮去用,有很多的疑问还需要一一去验证,刚开始总是感觉找不到北,总是感觉有很多概念,而且似乎ng既夹杂MVC又夹杂MVVM的思想, 忙里偷闲敲了 ...

  2. Nodejs之MEAN栈开发(四)---- form验证及图片上传

    这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R ...

  3. 给ubuntu中的软件设置desktop快捷方式(以android studio为例)

    ubuntu的快捷方式都在/usr/share/applications/路径下有很多*.desktop(eclipse的快捷方式也可以类似设置) 下面就建立我们的studio sudo gedit ...

  4. webmagic的设计机制及原理-如何开发一个Java爬虫

    之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...

  5. Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)

    Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码) http://blog.csdn.net/helonsy/article/details/7207497 ...

  6. OpenGL新手框架

    开始学习用OpenGL,也就想显示一些点,以为挺简单的,哎,看了两天才会画三维的点,做个总结. 使用OpenGL的基本流程 int main(int argv, char *argc[]) { //初 ...

  7. 转: IntelliJ IDEA 2016.2.2注册码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  8. angular.js写法不规范导致错误

    以下写法:没有明确指定module和controller,写法不规范. 更改angular.js版本会出bug. <html ng-app> <head> <title& ...

  9. HTML5 canvas 捕鱼达人游戏

    在线试玩:http://hovertree.com/texiao/html5/33/ html5利用canvas写的一个js版本的捕鱼,有积分统计,鱼可以全方位移动,炮会跟着鼠标移动,第一次打开需要鼠 ...

  10. T- SQL性能优化详解

    摘自:http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册 ...