1.什么是守护线程
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。而java中的守护线程又是什么概念呢?
我们平时创建的线程叫作用户线程,可以理解为系统的工作线程,而守护线程则是用来服务于用户线程的
2.守护线程的作用
当存在任意一个用户线程时,JVM便不会退出。假设此时只有一个用户线程,且是一个无限循环的线程
class MyThtead extends Thread {
public void run() {
while (true) {
System.out.println("用户线程运行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
}
}
如果这个用户线程不结束,JVM进程就无法结束。这就导致一个问题:由谁负责结束这个线程呢?
java提供了一个守护线程(Daemon Thread)来帮助我们解决这个问题,即
守护线程是指为其他线程服务的线程。在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出
3.守护线程如何使用
在调用线程start()方法前,调用setDaemon(true)把该线程标记为守护线程
Thread MyThtead = new MyThtead();
MyThtead.setDaemon(true);//一定要在调用start()之前设置
MyThtead.start();
4.守护线程的应用
4.1 注意事项
(1) setDaemon()必须要在start()之前调用,否则会抛出
IllegalThreadStateException异常
(2)在Daemon线程中产生的新线程也是Daemon的
4.2 通过isDaemon()判断是用户线程还是守护线程
4.3 垃圾回收线程的应用
垃圾回收线程就是一个守护线程,因为垃圾回收机制需要一直有个线程运行进行回收工作,如果用户线程全部结束,则意味着这个程序无事可做。守护线程要守护的对象已经不存在了,那么整个应用程序就应该结束,java虚拟机自然就退出了
4.4 诡异的web定时任务
Web 应用中启动一个线程,这个线程的生命周期并不会和Web应用程序保持同步,即web应用结束了,但是应用中的定时任务仍然运行着。
这是因为线程是JVM层面的,当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。而spring中的的TimerFactoryBean和SchedulerFactoryBean能保证timer和Spring容器的生命周期关联,在 Spring容器启动时启动调度器,而在Spring容器关闭时,停止调度器。所以在Spring中通过这两个FactoryBean配置调度器,再从 Spring容器中获取调度器引用,进行任务调度,将不会出现这种Web容器关闭而任务依然运行的问题
5 小结
本文讲述了什么是用户线程,守护线程,以及守护线程的作用,在垃圾回收中的使用和应用案例
一起探索架构技术,拥抱AI,欢迎与我交流!