Остановка задачи таймера из потока Runnable при завершении работы

У меня есть TimerTask, который запускается первым в моем методе run() моего класса Runnable. Я хочу убедиться, что он останавливается при завершении работы.

Runnable запускается через ExecutorService. Я не вижу способа вернуть крючок для выполнения из ExecutorService, когда вызывается shutdown().

Как я могу убедиться, что TimerTask остановлен?

Спасибо


person Andy W    schedule 06.05.2013    source источник
comment
Я предполагаю, что вы имеете в виду Timer? TimerTask — это просто еще один Runnable. Напрашивается вопрос... почему вы запускаете еще один поток внутри Runnable, который находится в пуле потоков?   -  person Brian Roach    schedule 07.05.2013


Ответы (2)


используйте ExecuterService.submit(), чтобы вернуть объект Future после завершения задачи.

ExecutorService.Submit()

person deepdroid    schedule 06.05.2013
comment
Брайан, у меня есть процесс, который должен отправлять эхо-запросы к другому сервису каждые x минут во время его работы (фактически сообщая сервису, что он все еще работает). Я думал, что TimerTask, который начинается в начале и останавливается в конце, будет лучшим способом справиться с этим. Я рассмотрю метод отправки, используя будущее. - person Andy W; 07.05.2013

Вызов метода TimerTask.cancel() должен сделать желаемое.

Ваш метод Runnable.run может быть разработан следующим образом:

public void run() {
    pingTask = new PingTimerTask(...);
    try {
        ...
    } finally {
        /* this code even gets executed when an exception
         * (for example an *InterruptedException*) was thrown:
         */
        pingTask.cancel();
    }
}
person fjf2002    schedule 06.05.2013
comment
Я использую TimerTask.cancel(), чтобы остановить его в обычной ситуации. Меня больше беспокоит то, что сервер был остановлен, а работа прерывается, и я также останавливаю TimerTask. - person Andy W; 07.05.2013
comment
Вот еще некоторые подробности. Внутри моего метода run() моего Runnable (начинается с вызова executorService.execute(new Parser(file));) Timer timer = new Timer(); pingTask = new PingTimerTask(getHandlerService().findGptsRootUrl(), getParserFile().getInputFileStatusId()); timer.scheduleAtFixedRate(pingTask, TIMER_DELAY, TIMER_DELAY); в конце я вызываю pingTask.cancel(), чтобы остановить повторный запуск таймера. - person Andy W; 07.05.2013
comment
Я обнаружил, что ключевым моментом является вызов метода cancel() для самого объекта Timer, а не для запланированного объекта TimerTask. Я больше не вижу никаких ссылок на все еще работающий поток Timer. - person Andy W; 07.05.2013