Проблема с заданием таймера в Java - PullRequest
0 голосов
/ 05 января 2012

Я использую задачу таймера в своем веб-приложении и в обработчике 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);

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

SEVERE: веб-приложение [/ LoggingMonitor], похоже, запущено поток с именем [Timer-1], но не смог остановить его. Это очень может вызвать утечку памяти.

1 Ответ

1 голос
/ 05 января 2012

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

2.Если задание таймера не было равно нулю, вы получаете эту ошибку сервера.не удалось остановить его " Ответ: Если вы проверяете Javadoc TimerTasks, он говорит:" Если задача выполняется, когда происходит вызов отмены, задача будет выполнена до завершения, но никогда не будет выполняться снова ", поэтому очевидно, чтоздесь задача еще не завершена, к тому времени, как contextDestroyed будет завершен.для этого вы можете проверить тип возвращаемого значения этого метода и дождаться завершения задачи, а затем выйти из метода уничтоженного контекста.

...