线程分为用户线程和守护线程
守护线程是用来守护用户线程的
守护线程可以用来做一些记录日志,监控内存,垃圾回收等工作
daemon属性
Thread类中有一个daemon属性,默认值为false,也就是非守护线程,即用户线程,当daemon值为true时,该线程为守护线程
private boolean daemon = false;
设置守护线程
Thread类提供了setDaemon(boolean)方法,设置daemon值为true即将线程设置为守护线程
public final void setDaemon(boolean on)
查看线程是否为守护线程
Thread类提供了isDaemon()方法获取daeman属性的值
public final boolean isDaemon() {
return daemon;
}
守护线程伴随着用户线程存在
// 定义一个守护线程
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是一个守护线程!!!");
}
}
});
// 设置成守护线程
thread1.setDaemon(true);
// 启动守护线程
thread1.start();
// 定义一个用户线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是用户线程!");
}
System.out.println("用户线程执行完毕!");
}
}).start();
运行结果
我是一个守护线程!!!
我是用户线程!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是用户线程!
我是一个守护线程!!!
我是一个守护线程!!!
我是用户线程!
我是用户线程!
用户线程执行完毕!
我是一个守护线程!!!
代码中守护线程是死循环,但是守护线程自己停下来了
可以看出,守护线程会随着用户线程执行完毕而完成自己的使命,可能在用户线程执行完立即停止,也可能执行一段时间后停止,总之用户线程不在了,守护线程会自动销毁。