java - 执行者中的关闭是如何工作的?

标签 java multithreading tomcat executorservice

我有一个 ScheduledExecutorService,我每 15 分钟执行一次任务(在 Tomcat 中的 Web 应用程序中)。
contextDestroyedServletContextListener 中我做了:

Runtime.getRuntime().addShutdownHook(new Thread(){  
            @Override  
            public void run(){  
                scheduler.shutdown();   
            }   
        });    

调度程序启动如下:

final Runnable r = new Runnable(){

            @Override
            public void run() {
                System.out.println("My task");
                //Do some task
            }

        };
updater.scheduleWithFixedDelay(r, 30, 15, TimeUnit.MINUTES);

问题:在关机时,任何剩余的任务都不会执行。
有一个任务正在运行,但我没有看到任何日志,所以它似乎没有执行。为什么?

更新:
如果我启动 tomcat,然后在 2 分钟后关闭,那么任务是否被视为已安排且必须运行?我的意思是如果提交了一个任务,它不被认为是待处理的吗?或者它必须实际运行?

最佳答案

要显式等待所有正在运行的任务完成,请执行以下操作:

try {
  // Wait for one second indefinitively
  while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) {
    // wait until completion
  }
} catch (final InterruptedException ex) {
  // interrupted... you may log something
}

关于java - 执行者中的关闭是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908221/

相关文章:

java - 使用 DOM 迭代包含一些具有相同名称的标签的 NodeList

c++ - 在多线程环境中使用 std::call_once() 进行初始化

Python:启动类方法时线程不起作用

c# - 线程和 IEnumerable; "Collection Was Modified"- 异常

java - Spring Boot Rest API 不会在 Tomcat 8.5.47 上部署,错误代码为 "org.apache.catalina.LifecycleException: Failed to start component"

java - eclipse 火星 : Content Assistant doesn't complete when pressing dot

java - 如何获取 Eclipse 中方法抛出的具体异常列表

java - 正确的打字顺序

java - 如何在本地 TomCat 服务器托管的 JSF 应用程序中使用在外部 JAR 中声明的接口(interface)

java - 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理