理解:
我们知道,进程可以理解为一个公司,而线程则可以理解为公司的员工,当需要进行某个功能的执行时,公司就会启动运作,公司中的员工就各司其职进行工作,那么守护线程怎么理解呢?
通过字面意思可以这样理解,既然是守护,那么肯定守护线程是与被守护的线程同时存在且同时工作,如果被守护的员工(线程)死亡(停止),那么守护的工作就没必要进行下去了,因为没有需要被守护的员工(线程)了。
在整个JVM里面最大的守护线程就是GC线程,程序执行过程中GC线程会一直存在,如果程序执行完毕,GC线程也会停止。
Thread类中有方法:
- 设置为守护线程: public final void setDaemon( boolean on);
- 判断是否为守护线程: public final boolean isDaemon();
测试代码:
还未使用方法设置守护线程时、
public class Main { public static void main(String[] args){ Thread userThread = new Thread(()->{ for (int x = 1; x < 100; x++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!"); } },"用户"); // 完成核心业务 Thread deamonThread = new Thread(()->{ for (int x = 1; x < 100; x++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!"); } },"守护"); userThread.start(); deamonThread.start(); } }
输出结果:
线程交替执行。
并且当用户线程的运行次数少于守护线程时,当用户线程运行完后,守护线程会继续运行。
但是设置守护线程后:
package Demo_2_2_线程守护; public class Main { public static void main(String[] args){ Thread userThread = new Thread(()->{ for (int x = 1; x < 10; x++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!"); } },"用户"); // 完成核心业务 Thread deamonThread = new Thread(()->{ for (int x = 1; x < 100; x++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!"); } },"守护"); deamonThread.setDaemon(true); // 设置为守护线程 userThread.start(); deamonThread.start(); } }
输出结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)