java守护线程及其应用
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获取,采用守护线程的方式,因为主程序结束后,数据采集也就没有意义了
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
原码、反码、补码的相互转换