Java Tomcat 7和ScheduledExecutorService.shutdown
我正在使用Java Tomcat 7和ScheduledExecutorService.shutdown,java,tomcat7,executorservice,Java,Tomcat7,Executorservice,我正在使用ScheduledExecutorService运行调度线程。 我实现了ServletContextListener.contextDestroyed并调用了ScheduledExecutorService.Shutdownow和等待终止 以下是一个例子: @Override public void contextDestroyed(ServletContextEvent servletcontextevent) { pool.shutdownNow(); // Disable
ScheduledExecutorService
运行调度线程。我实现了
ServletContextListener.contextDestroyed
并调用了ScheduledExecutorService.Shutdownow
和等待终止
以下是一个例子:
@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]的线程,但未能停止它。这很有可能 创建内存泄漏 可以忽略此日志吗?还是我做错了什么
谢谢您正确地关闭了您的
ScheduledExecutor服务
。但是,默认情况下,ExecutorService
创建的线程遵循以下命名约定:pool-X-thread-Y
Timer-0
线程由Timer
类创建。在代码和库中查找它们。是否确定此错误与线程池有关?从线程名“Timer-0”判断,它可能是由某种计时器启动的
此外,shutdownNow()还应返回等待终止的任务列表(请参阅JavaDoc)。若列表不是空的,你们可以建立逻辑来等待更多的时间。我的意思是,我的想法是:你们的清理责任在哪里停止?这里还能做些什么?用消防水龙带打箱子?说真的,我想说的是,看起来你正在做你能做的一切。。。我将忽略该错误。您可以参考我以前的帖子:)是否等待已计划的任务或当前正在执行的任务?或者两者都有?是否有一种方法只等待当前正在执行的任务(比如,我不想等待一个小时内执行的任务,但我真的想等待一个当前在其<代码>执行程序> /代码>方法中间的任务吗?