gpt4 book ai didi

java - 让守护线程运行直到 JVM 退出

转载 作者:行者123 更新时间:2023-12-01 18:56:00 24 4
gpt4 key购买 nike

在阅读了抛出守护线程并根据我的要求实现后,提出了一些疑问。请澄清一下

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

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

最佳答案

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

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

请注意,将线程标记为守护进程仅意味着虚拟机不会等到线程退出才关闭。有关线程终止的其他行为均不受线程是否为守护进程的影响。

关于java - 让守护线程运行直到 JVM 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13908978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com