1.概念

守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。

通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。这种方法通常被称为“脱壳”。

系统通常在启动时一同启动守护进程。守护进程为对网络请求,硬件活动等进行响应,或其他通过某些任务对其他应用程序的请求进行回应提供支持。守护进程也能够对硬件进行配置(如在某些Linux系统上的devfsd),运行计划任务(例如cron),以及运行其他任务。

在DOS环境中,此类应用程序被称为驻留程序(TSR)。在Windows系统中,由称为Windows服务的应用程序来履行守护进程的职责。

在原本的Mac OS系统中,此类应用程序被称为“extensions”。而作为Unix-like的 Mac OS X有守护进程。(在Mac OS X中也有“服务”,但他们与Windows中类似的程序在概念上完全不相同。)

2.关键点理解

1).所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程.

2).Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出。 
  虚拟机中可能会同时有很多个线程在运行,只有当所有的非守护线程都结束的时候,虚拟机的进程才会结束,不管在运行的线程是不是main()线程。

3).Main主线程结束了(Non-daemon thread),如果此时正在运行的其他threads是daemon threads,JVM会使得这个threads停止,JVM也停下.
  如果此时正在运行的其他threads有Non-daemon threads,那么必须等所有的Non daemon线程结束了,JVM才会停下来.

4).总之,必须等所有的Non-daemon线程都运行结束了,只剩下daemon的时候,JVM才会停下来,注意Main主程序是Non-daemon线程.

5).默认产生的线程全部是Non-daemon线程.

3.example

class   A   implements   Runnable{
public void run(){
for(;;){
System.out.println("Thread A run");
}
} public static void main(String[] args){
System.out.println("Thread main started!");
try{
(new Thread(new A())).start();
} catch (Exception e){
}
System.out.println("Thread main ended!");
}
};

会一直跑下去,因为main进程结束了,但   A   进程还没有结束,虚拟机不能退出.

class   A   implements   Runnable{
public void run(){
for(;;){
System.out.println("Thread A run");
}
} public static void main(String[] args){
System.out.println("Thread main started!");
try{
Thread a = new Thread(new A());
a.setDaemon(true);
a.start();
} catch(Exception e){
}
System.out.println("Thread main ended!");
}
};

main线程一退出,虚拟机就退出了,因为剩下在跑的a线程是守护线程,虚拟机不管它的死活的,直接退出了。

最新文章

  1. 关系数据库SQL之可编程性事务
  2. lucene全文检索---打酱油的日子
  3. jsr133
  4. JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
  5. DCDC(4.5V to 23V -3.3V)
  6. js实现加减乘除
  7. javascript事件机制
  8. 用root直接登入ubuntu 14_04
  9. zxing二维码扫描的流程简析(Android版)
  10. Python3基础 使用for循环 删除一个列表中的重复项
  11. 如何用SQL实现组内前几名的输出
  12. Reinforcement Learning: An Introduction读书笔记(1)--Introduction
  13. 重新认识 Delphi
  14. VBA二次学习笔记(2)——两个Excel表内容比较
  15. day_4.28 py
  16. CAS 原理
  17. 前端开发---HTML---介绍
  18. python学习之老男孩python全栈第九期_day008知识点总结
  19. [经典Bug]Android-初始化闪屏不消失
  20. Windows进程间共享内存通信实例

热门文章

  1. 使用SoupUI进行简单的WebService接口测试
  2. du,df 磁盘管理
  3. 拉取代码过程中遇到的:post install error,please remove node_modules before retry!
  4. Dubbo通过注解实现RPC调用
  5. oracle的批量插入sql
  6. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
  7. MySQL设置某一字段默认为0,但是插入数据化却显示为null
  8. 设计模式--中介者模式C++实现
  9. [oracle] DBLINK +同义词,实现本地数据库访问另一台机器的数据库
  10. Python3 学习第十三弹: 模块学习五之pickle与json