记录日常开发过程中遇到的一些小的疑问,疑惑,侧重于记录小的知识点
springboot中main方法执行完为什么不退出
首先明白一个概念,守护线程和用户线程,Daemon Thread和User Thread
- 定义:守护线程,在没有用户线程可服务时会自动离开。
- 优先级:守护线程的优先级较低,用于为系统中的其它对象和线程提供服务。
在main方法中,如果有非守护线程,那么main方法执行完之后,JVM不会立即退出,会等到所有的非守护线程执行完之后才退出,下面是一个新建的springboot项目中,启动后,通过jprofiler查看到的线程情况
从上图可以看出,main线程结束之后,其他子线程依旧在运行,在看下dump可以看出,main2线程在sleep
通过dump信息,追踪到代码中,可以看出main2的sleep是由于dubbo的TpsLimitFilter类启动了new Thread,并且sleep1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16static {
(new Thread(new Runnable() {
public void run() {
while(true) {
try {
Thread.sleep(1000L);
synchronized(TpsLimitFilter.notifyObject) {
TpsLimitFilter.notifyObject.notifyAll();
}
} catch (InterruptedException var4) {
var4.printStackTrace();
}
}
}
})).start();
}