【问题标题】:Tomcat 7 and ScheduledExecutorService.shutdownTomcat 7 和 ScheduledExecutorService.shutdown
【发布时间】:2012-04-13 09:49:50
【问题描述】:

我正在使用ScheduledExecutorService 运行预定线程。
我实现了ServletContextListener.contextDestroyed 并调用了ScheduledExecutorService.shutdownNowawaitTermination

这是一个例子:

@Override
public void contextDestroyed(ServletContextEvent servletcontextevent) {
    pool.shutdownNow(); // Disable new tasks from being submitted
    try {
      // Wait a while for existing tasks to terminate
      if (!pool.awaitTermination(50, TimeUnit.SECONDS)) {
        pool.shutdownNow(); // Cancel currently executing tasks
        System.err.println("Pool did not terminate");
      }
    } catch (InterruptedException ie) {
      // (Re-)Cancel if current thread also interrupted
      pool.shutdownNow();
      // Preserve interrupt status
      Thread.currentThread().interrupt();
    }        
}


不过,我从 Tomcat 7 收到以下错误:

严重:Web 应用程序 [/servlet] 似乎已启动 线程名为 [Timer-0] 但未能停止它。这很有可能 造成内存泄漏。

可以忽略此日志吗?还是我做错了什么?

谢谢

【问题讨论】:

  • 我的意思是,我的想法是:您进行清理的责任在哪里停止?这里还能做什么?用消防水带打箱子?说真的,我的意思是看起来你正在做你能做的所有事情......我会忽略这个错误。
  • 你可以参考我之前的帖子 :) stackoverflow.com/questions/9926356/…

标签: java tomcat7 executorservice


【解决方案1】:

您确定此错误与您的线程池有关吗?从线程名称“Timer-0”来看,它可能是由某种计时器启动的。

另外,shutdownNow() 应该返回仍然等待终止的任务列表(参见 JavaDoc)。如果列表不为空,您可以构建逻辑以等待更多时间。

【讨论】:

    【解决方案2】:

    您正确地关闭了ScheduledExecutorService。但是,ExecutorService 创建的线程默认遵循以下命名约定:pool-X-thread-Y

    Timer-0 线程由Timer 类创建。在您的代码和库中查找它们。

    【讨论】:

    • shutDownNow() 是否等待已安排的任务或当前正在执行的任务?或两者?有没有办法只等待当前正在执行的任务(比如我不想等待我计划在一个小时内执行的任务,但我确实想等待当前正在执行的任务execute() 方法)?
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 2018-12-06
    • 2011-07-14
    • 2013-10-11
    • 2014-03-26
    • 2014-04-28
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多