[英]Issue with Timer Task in Java
我在Web应用程序和onContextDestroyed处理程序中使用计时器任务,在使用以下代码将所有内容设置为空:
System.out.println("contextDestroyed - fileWatcherTask:"+fileWatcherTask);
System.out.println("contextDestroyed - mytimer:"+mytimer);
fileWatcherTask.cancel();
mytimer.cancel();
System.gc();
if (fileWatcherTask != null) {
System.out.println("fileWatcherTask is not null");
fileWatcherTask=null;
}
if (mytimer!=null)
{
System.out.println("mytimer is not null");
mytimer=null;
}
System.out.println("contextDestroyed - logTimerTask After invoking cancel mytimer: "+mytimer);
System.out.println("contextDestroyed - logTimerTask After invoking cancel fileWatcherTask: "+fileWatcherTask);
但是,有时它打印为null,有时不是。 谁能告诉我问题出在哪里? 如果不为null,我将获得以下Catalina日志输出:
严重:Web应用程序[/ LoggingMonitor]似乎已启动名为[Timer-1]的线程,但未能停止它。 这很可能造成内存泄漏。
这里有两个问题:1. 但是有时它显示为null,有时却不显示 :我不确定这一点,因为这取决于创建和使用timertask的代码。
2.如果timertask不为null,则出现此服务器错误“严重:Web应用程序[/ LoggingMonitor]似乎已启动名为[Timer-1]的线程,但未能停止它”回答:如果您检查了TimerTasks Javadoc,它说:“如果在取消调用发生时任务正在运行,任务将运行到完成,但是将永远不会再运行”,因此很显然,在contextDestroyed完成之前,任务仍未完成。 为此,您可以检查此方法的返回类型并等待任务完成,然后从上下文销毁方法中退出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.