Java中的Timer Task问题

时间:2012-01-05 08:06:08

标签: java timer catalina

我在我的网络应用程序和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 个答案:

答案 0 :(得分:1)

这里有两个问题: 1.但有时它会打印为null,有时它不会 Ans:我不确定这一点,因为这取决于创建和使用timertask的代码。

2.如果timertask不为null,则会出现此服务器错误“SEVERE:Web应用程序[/ LoggingMonitor]似乎已启动名为[Timer-1]的线程,但未能将其停止” Ans:如果你检查了TimerTasks Javadoc,它会说“如果在取消调用时任务正在运行,任务将运行完成,但永远不会再运行”,所以显然,这里的任务仍然没有完成, contextDestroyed的时间已完成。 为此,您可以检查此方法的返回类型,并等待任务完成,然后退出上下文销毁方法。