java线程分为两种 :用户线程(User Thread)和守护线程(Daemon Thread)。
平时我们常用的就是用户线程,而守护线程很少用到,只有在一些特定场景中用到。守护线程一般是用来为其他线程服务的,比如JVM的垃圾回收,就是一个守护线程,为其他线程回收垃圾对象等。
守护线程的特点:生命周期依赖于其他线程,当最后一个用户线程结束后,守护线程就会强制结束,以前喜欢看玄幻小说,是不是很像小说中的主仆协议,主人死了,宠物也要死
代码
System.out.println("主线程运行开始");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("用户线程运行中");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
System.out.println("主线程运行结束");
结果
主线程运行开始
主线程运行结束
用户线程运行中
用户线程运行中
用户线程运行中
用户线程运行中
用户线程运行中
用户线程运行中
通过上面代码的执行结果来看,主线程结束后,但是用户线程依然运行,JVM无法退出
代码
System.out.println("主线程运行开始");
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println("守护线程运行中");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.setDaemon(true);
thread.start();
System.out.println("主线程运行结束");
结果
主线程运行开始
守护线程运行中
主线程运行结束
但是如果是一个守护线程,主线程结束后,守护线程就会强制结束,非常适合执行一些后台任务
实际应用场景:记得18年刚工作的时候,当时负责一个养老平台开发,对接一个床垫,老人睡眠心率、血压、睡眠状况会通过大屏展示,数据采集是实时的,数据采集是通过一个while死循环加sokect获取,采用守护线程的方式,因为主程序结束后,数据采集也就没有意义了