2012-01-05 3 views
0

Я использую задание таймера в моем веб-приложение, и в обработчике onContextDestroyed, я использую следующий код, чтобы сделать все пустое:Проблема с таймером Задача в Java

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); 

Однако иногда печатает в нуль и иногда это не так. Может ли кто-нибудь сказать мне, в чем проблема? И если это не обнулить я получаю следующее Catalina войти выход:

жестки: веб-приложение [/ LoggingMonitor], кажется, начал нить с именем [Таймер-1], но не смог остановить его. Это очень , вероятно, создаст утечку памяти.

ответ

1

есть два вопроса: 1.But иногда это печать утратившим иногда не Ans: Я не уверен в этом, так как это зависит от кода, где TimerTask является создан и используется.

2.Ел TimerTask не были пустыми, то вы получите эту ошибку сервера «жестко: веб-приложение [/ LoggingMonitor], кажется, начал нить с именем [Таймер-1], но не смог остановить его» Ans: Если вы проверяете TimerTasks Javadoc, в нем говорится: «Если задача выполняется, когда происходит вызов для отмены, задача будет выполняться до завершения, но никогда не будет работать снова», так что, очевидно, здесь задача все еще не завершена, к тому времени, когда contextDestroyed будет завершен. Для этого вы можете проверить тип возврата этого метода и дождаться завершения задачи, а затем выйти из метода, уничтоженного контекстом.

Смежные вопросы