Java中的线程分为用户线程User Thread和守护线程Daemon Thread;
一个线程调用void setDaemon(boolean on) 方法可以将自己设置成一个守护线程,例如:
Thread.setDaemon(true);
线程默认是非守护线程,也称用户线程。
当程序中的所有用户线程都已结束运行时,即使守护线程的run()方法中还有需要执行的语句,守护线程也立刻结束运行。因为没有需要被守护者,守护者没有存在的意义了。可以用守护线程做一些不是很严格的工作,线程的随时结束不会产生什么不良的后果。一个线程必须在运行之前设置自己是否是守护线程。
下面是关于一个守护线程的例子,比较当线程B是守护线程时和非守护线程时的区别
public class DaemonThread {
public static void main(String args[]) {
Daemon a = new Daemon();
a.A.start();
a.B.setDaemon(true);
a.B.start();
}
}
class Daemon implements Runnable {
Thread A,B;
Daemon() {
A = new Thread(this);
B = new Thread(this);
}
public void run() {
if(Thread.currentThread()==A) {
for(int i=0;i<8;i++) {
System.out.println("i="+i);
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
}
}
}
else if(Thread.currentThread()==B) {
while(true) {
System.out.println("线程B是守护线程");
try {
Thread.sleep(1000);
}catch(InterruptedException e) {}
}
}
}
}
运行结果为
i=0
线程B是守护线程
线程B是守护线程
i=1
线程B是守护线程
i=2
线程B是守护线程
i=3
线程B是守护线程
i=4
线程B是守护线程
i=5
线程B是守护线程
i=6
线程B是守护线程
i=7
线程B是守护线程
当B为非守护线程时,运行结果为
线程B不是守护线程
i=0
线程B不是守护线程
i=1
线程B不是守护线程
i=2
线程B不是守护线程
i=3
线程B不是守护线程
i=4
线程B不是守护线程
i=5
线程B不是守护线程
i=6
线程B不是守护线程
i=7
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
.........
执行完线程A后 线程B无限执行下去。
作者:zhuhao717
博客:http://blog.csdn.net/zhuhao717(转载请说明出处)