Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使守护进程线程运行到JVM退出_Java_Multithreading_Daemon_Background Process - Fatal编程技术网

Java 使守护进程线程运行到JVM退出

Java 使守护进程线程运行到JVM退出,java,multithreading,daemon,background-process,Java,Multithreading,Daemon,Background Process,在阅读了throw守护进程线程并按照我的要求实现之后,我提出了一些疑问。 请澄清 我使用ServletContextListener类来调用需要运行unitl JVM出口的守护进程线程 public void contextInitialized (ServletContextEvent event) { context = event.getServletContext(); //getting from spring context MyServiceMana

在阅读了throw守护进程线程并按照我的要求实现之后,我提出了一些疑问。 请澄清

  • 我使用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停止(服务器停止),否则告诉它不要退出


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

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

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


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

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

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


    请注意,将线程标记为守护进程只意味着VM不会等到线程退出后再关闭。线程是否为守护进程不会影响线程终止的任何其他行为。

    实际上startService块在循环中包装了整个try-catch异常。它不会抛出任何异常因此,我猜想守护进程线程应该永远运行。当服务器停止或JVM关闭时会发生什么。DeAMon线程应该被正确地杀死。如果不是,可以从Servlet的上下文破坏方法杀死它吗?@ NITIGURURRAM——当JVM关闭时,所有线程停止。注意,I/O中间的守护进程线程可以在没有BEE的情况下停止。ng提供了一个正确清理的机会。如果需要给守护程序线程一个清理的机会,您应该注册一个。该方法的文档有关闭过程的详细描述。实际上startService块在循环中有一个整体的try-catch异常。它不会抛出任何异常。所以我想守护程序线程应该当服务器停止或JVM关闭时会发生什么。DeAMon线程应该被正确地杀死。如果不是,可以从Servlet的上下文破坏方法中杀死它吗?@ NITIGURURRAM——当JVM关闭时,所有线程停止。注意,I/O中间的守护进程线程可以停止,而不必有机会清理PROP。如果你需要给守护进程一个清理的机会,你应该注册一个。该方法的文档有关闭过程的详细描述。