【问题标题】:Making Daemon Thread to run till JVM Exits使守护线程运行直到 JVM 退出
【发布时间】:2012-12-17 05:52:02
【问题描述】:

阅读 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 停止(服务器停止),否则告诉它不要退出。

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

【问题讨论】:

    标签: java multithreading daemon background-process


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际上 startService 块在循环周围有整体的 try catch 异常。它不会抛出任何异常。所以我猜守护线程应该永远运行。当服务器停止或 JVM 关闭时会发生什么。应该正确杀死守护线程。如果没有,是否可以从 servlet 的 contextDestroyed 方法中杀死它?
    • @NitinGurram - 当 JVM 关闭时,所有线程都会停止。请注意,I/O 中间的守护线程可能会在没有机会正确清理的情况下停止。如果你需要给守护线程一个清理的机会,你应该注册一个shutdown hook。该方法的文档对关闭过程有详细的描述。
    猜你喜欢
    • 1970-01-01
    • 2014-03-17
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多