0

在阅读了 throw Daemon threads 并根据我的要求实现之后提出了几个疑问。请澄清我

  1. 我正在使用 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();    
    }
    
  2. 在 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 停止(服务器停止),否则告诉它不要退出。

注意:我正在尽我的能力来格式化这篇文章。但是今天发生了一些事情,它没有被格式化:(

4

1 回答 1

4

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

请注意,如果startService()在等待 I/O、睡眠或处于等待状态时被中断,则通常会抛出InterruptedException. 表现良好的线程通常在它们被中断时退出,因为这是告诉线程退出的正常方法。

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

于 2012-12-17T06:01:40.773 回答