日常疑问随写

记录日常开发过程中遇到的一些小的疑问,疑惑,侧重于记录小的知识点

springboot中main方法执行完为什么不退出

首先明白一个概念,守护线程和用户线程,Daemon Thread和User Thread

  • 定义:守护线程,在没有用户线程可服务时会自动离开。
  • 优先级:守护线程的优先级较低,用于为系统中的其它对象和线程提供服务。
    在main方法中,如果有非守护线程,那么main方法执行完之后,JVM不会立即退出,会等到所有的非守护线程执行完之后才退出,下面是一个新建的springboot项目中,启动后,通过jprofiler查看到的线程情况
    bp
    从上图可以看出,main线程结束之后,其他子线程依旧在运行,在看下dump可以看出,main2线程在sleep
    blockchain
    通过dump信息,追踪到代码中,可以看出main2的sleep是由于dubbo的TpsLimitFilter类启动了new Thread,并且sleep
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    static {
    (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();
    }