java中的守护程序线程

Roo*_*kie 3 java

我对守护程序线程感到困惑.在大多数站点中,它被写入,它在应用程序停止时终止但是如果应用程序连续运行会怎样.

Ste*_*n C 9

...但是如果应用程序连续运行会怎么样

然后守护程序线程继续运行.

(这假定有问题的线程不会从其run()方法返回,或者因未捕获的异常而死亡.)


将线程标记为"守护程序"的目的是告诉JVM在启动关闭之前不需要等待线程完成.(关闭的另一种方法是进行一些线程调用System.exit().即使存在其他非守护进程线程,也会启动关闭.)


跟进

我有一个在tomcat服务器下连续运行的应用程序,我从注释中推断出守护程序线程创建的注释不会因为应用程序没有停止而停止,但是如果我们尝试直接停止tomcat服务器会产生内存泄漏吗?

如果停止webapp(但不是tomcat服务器),则守护程序线程将继续运行.如果你想让你的webapp创建的线程消失,你必须编写你的webapp来监听相关的上下文事件,并中断(或其他)线程使它们关闭.

如果你关闭tomcat,那么一切都会消失,包括守护进程线程:

  1. 当您成功停止tomcat服务器(例如"catalina.sh stop")时,JVM退出并且所有线程(守护程序或其他)死亡.

  2. 运行"catalina.sh stop" 可能会失败,但仅仅存在一个守护程序线程不会导致它失败.

    无法停止可能是由于某些webapp在其关闭事件处理中陷入困境,或者可能是由于tomcat服务器处于挂起或无响应状态.在至少某些版本的Tomcat中,非守护程序线程的存在足以导致关闭失败.)

  3. 如果你运行"catalina.sh stop -force",那么如果tomcat实例在5秒内无法关闭,那么它将被终止; 请参阅"catalina.sh help"或脚本的来源.

当您关闭并重新启动tomcat时,线程泄漏和内存泄漏都没有实际意义.实际上,这是泄漏的经典解决方法.


Jac*_*erk 5

正确.只有在所有非守护程序线程完成后,应用程序才会退出.这不适用于守护程序线程.

澄清:

public static void main(String[] args) {
   Thread thread = new Thread() {
      @Override
      public void run() {
        while (true) {
          // do something...
        } 
      }
   }
   thread.setDaemon(true);
   thread.start();
}
Run Code Online (Sandbox Code Playgroud)

以上将立即退出.但是,如果省略thread.setDaemon(true),程序将不会终止.