首页 文章

使守护程序线程运行直到JVM退出

提问于
浏览
0

阅读后抛出守护进程线程并根据我的要求实现提出了几个疑问 . 请澄清我

  • 我正在使用ServletContextListener类来调用需要运行unitl JVM退出的守护进程线程
public void contextInitialized (ServletContextEvent event) {

     context = event.getServletContext();
     //getting from spring context
     MyServiceManager serviceManager = (MyServiceManager) ctx.getBean("myServiceManager");
     serviceManager.setDaemon(true);
     serviceManager.start();    
}
  • 在ServiceManager类中我运行一个无限循环来运行程序,直到JVM存在
public void run() {
    try {
        startService();
    } catch (Exception e) {
        logger.error("Error Occured in Background Process Runner");
    }
}

private void startService(){
    while(true){
       try{
        //invoke some new threads and do processing jobs until server/jvm stops
           }catch(Exception e) {
            //log but don't quit
           }
        }
    }
}

值得关注的是,具有上述实施的守护程序线程是否会运行?如果没有,我该怎么做才能完成我的工作 . 除非JVM停止(服务器停止),否则告诉它不要退出 .

注意:我正在尝试使用此级别来格式化此帖子 . 但今天有事情要发生,它没有格式化:(

1 回答

  • 4

    您的守护程序线程将一直运行,直到 run() 方法终止,通过正常退出或抛出异常(或直到VM退出,这是您想要的) . 由于您捕获 startService() 抛出的所有异常,它将一直运行直到 startService() 返回或抛出异常,然后将正常退出 .

    请注意,如果 startService() 在等待I / O,休眠或处于等待状态时被中断,那么它通常会抛出 InterruptedException . 行为良好的线程通常在被中断时退出,因为这是告诉线程退出的常规方法 .

    请注意,将线程标记为守护程序仅意味着VM在关闭之前不会等待线程退出 . 关于线程终止的其他任何行为都不会受到作为守护程序的线程的影响 .

相关问题