java的守护线程的作用(在 java 中守护线程和本地线程区别?)
守护线程其实就是非守护线程的保姆,只有非守护线程存在时,守护线程才能存在,一旦非守护线程结束,则守护线程无条件地退出。
下面通过一个例子来说明守护线程的运行机制
/**
* 守护线程测试
* @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.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + j);
}
super.run();
}
};
// setDaemon, 不设置则默认false
watchThread.setDaemon(true);// 设置watchThread为守护线程
userThread.setDaemon(false);// 设置userThread为非守护线程
watchThread.start();
userThread.start();
System.out.println("===========main end===============");
}
}
运行结果
如果我注释非守护线程的运行代码://userThread.start();
运行结果会如何呢?
答案是守护线程不打印
通过上面的测试,我们得出结论:
守护线程是jvm中一切非守护线程的保姆,它的存亡无关紧要
那么守护线程的作用是什么呢?
1 jvm的垃圾回收器使用的就是守护线程,当某个线程运行产生的垃圾过多时,守护线程会实时监视并回收垃圾;当线程结束时,垃圾其实也相应地释放了,也就用不上守护线程了,守护线程也就退出了
2 守护线程用来服务于指定的线程,如数据连接池的关闭等,做一个辅助和保障功能;