http://fruitking.iteye.com/blog/419951
先来一个不是守护线程的例子:
public class Thread1 implements Runnable {
public void run() {
for (;;) {
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("Thread 1 run");
}
}
public static void main(String[] args) {
System.out.println("Thread main started!");
try {
(new Thread(new Thread1())).start();
} catch (Exception e) {
}
System.out.println("Thread main ended!");
}
}
这样主线程结束了,但是启动线程Thread1这个实例还没有结束,将一直运行下去
来看一个守护线程的例子:
public class ThreadDaemon implements Runnable {
public void run() {
for (;;) {
System.out.println("Thread 1 run");
}
}
public static void main(String[] args) {
System.out.println("Thread main started!");
try {
Thread a = new Thread(new ThreadDaemon());
a.setDaemon(true);
a.start();
} catch (Exception e) {
}
System.out.println("Thread main ended!");
}
}
运行结果如下:
Thread main started!
Thread main ended!
Thread 1 run
Thread 1 run
Thread 1 run
Thread 1 run
Thread 1 run
后面就停止没有了输出了
说明那个子线程ThreadDaemon也结束了
这就是守护线程的含义:只要主线程退出了,不管守护线程死活都强制退出
应用场景:
管理作用,后台管理者
比如:
进行内存回收,垃圾清理等工作
无论是什么线程,都一定会分时间片执行的,和上面的检测拼写及输入并没有任何关系
比如你正在 用 Java 写成的编辑器 写 Word 文档,
你一边敲键盘,这是个 非守护线程, 后台还有一个 拼写检查 线程,它是个守护线程,他尽量不打扰你写稿子, 你们可以同时进行,他发现有拼写错误时在状态条显示错误,但是你可以忽略。
就像 城堡门前有个卫兵 (守护线程),里面有诸侯(非守护线程),他们是可以同时干着各自的活儿,但是 城堡里面的人都搬走了, 那么卫兵也就没有存在的意义了。
守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)
所以setDeamon(true)的唯一意义就是告诉JVM不需要等待它退出,让JVM喜欢什么退出就退出吧,不用管它。