繁体   English   中英

Java中的计时器任务问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM