分析&回答
什么是守护线程?
- 守护线程是指在程序运行的时候在后台提供一种通用服务的线程,并且这个线程并不属于程序中不可或缺的部分。守护线程不阻止 Java 虚拟机 ( JVM ) 退出的线程。当所有非守护线程终止时,JVM 会放弃所有剩余的守护线程。
- 守护线程通常用于为其他线程执行一些支持或服务任务,但我们应该考虑到它们可能随时被放弃。
- 要将一个线程作为守护线程启动,应该在调用 start() 之前使用 setDaemon()方法设置为守护线程。如下所示
Thread daemon = new Thread(() -> System.out.println("Hello from daemon!"));
daemon.setDaemon(true); daemon.start();
反思&扩展
- setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateException异常,该线程仍默认为用户线程,继续执行
- 守护线程创建的线程也是守护线程
- 守护线程不应该访问、写入持久化资源,如文件、数据库,因为它会在任何时间被停止,导致资源未释放、数据写入中断等问题
- 后台进程在不执行finally子句的情况下就会终止其run()方法。
- JVM 中的垃圾回收线程就是典型的守护线程
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!