守护线程其实就是非守护线程的保姆,只有非守护线程存在时,守护线程才能存在,一旦非守护线程结束,则守护线程无条件地退出。
下面通过一个例子来说明守护线程的运行机制
/**
* 守护线程测试
* @author ssj
*
*/
public class SouhuTest {
public static void main(String[] arg0) {
System.out.println("===============main start=============");
Thread watchThread= new Thread("守护线程...") {
@Override
public void run() {
int j = 0;
while (j<1000) {
j++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + j);
}
super.run();
}
};
Thread userThread = new Thread("非守护线程") {
@Override
public void run() {
int j = 0;
while (j <= 3 j try thread.sleep1000 catch interruptedexception e e.printstacktrace system.out.printlnthread.currentthread.getname j super.run setdaemon false watchthread.setdaemontrue watchthread userthread.setdaemonfalse userthread watchthread.start userthread.start system.out.println='==========main' end='==============");' codeprep data-track='52'>运行结果

如果我注释非守护线程的运行代码://userThread.start();
运行结果会如何呢?
答案是守护线程不打印

通过上面的测试,我们得出结论:
守护线程是jvm中一切非守护线程的保姆,它的存亡无关紧要
那么守护线程的作用是什么呢?
1 jvm的垃圾回收器使用的就是守护线程,当某个线程运行产生的垃圾过多时,守护线程会实时监视并回收垃圾;当线程结束时,垃圾其实也相应地释放了,也就用不上守护线程了,守护线程也就退出了
2 守护线程用来服务于指定的线程,如数据连接池的关闭等,做一个辅助和保障功能;