Как перезапустить TimerTask

Я написал задачу для отправки определенного TCP-сообщения через сокет. У меня есть файл с кучей сообщений и несколькими отметками времени, поэтому я запрограммировал задачу как TimerTask и запланировал ее с помощью таймера с отметкой времени первого сообщения.

Когда он завершается, метод запуска задачи завершается, но связанный с ним поток остается, он не отменяется. Если я попытаюсь перепланировать задачу с новым временем, я получаю исключение, говорящее мне, что я не могу перепланировать запланированную или отмененную задачу.

Я также пытался отменить его перед переносом, но, очевидно, как сказало исключение, проблема остается той же.

Я не могу запланировать задачу с постоянным периодом, чтобы она повторялась, потому что у каждого сообщения есть время, и оно непостоянно.

Как я могу изменить расписание TimerTask? И, кстати, есть ли способ дождаться завершения задачи, как при обмене данными через сокеты, когда он блокируется методом готовности до тех пор, пока не придет сообщение?


person Roman Rdgz    schedule 17.01.2013    source источник
comment
@pst Действительно, если я это сделаю, это сработает. Но, как я уже говорил, связанный поток продолжает работать даже после того, как его метод запуска достигает своего конца. Это означает, что когда отправлено 100 сообщений, существует более 100 живых потоков! Как я могу это исправить?   -  person Roman Rdgz    schedule 17.01.2013


Ответы (1)


TimerTask не предназначен для перепланирования, и именно Timer управляет (одним) потоком.

Используйте один таймер и многие new TimerTasks:

Каждому объекту Timer соответствует один фоновый поток, который используется для последовательного выполнения всех задач таймера.

После того, как последняя активная ссылка на объект Timer исчезнет и все незавершенные задачи будут завершены, поток выполнения задачи таймера [должен] корректно завершиться (и станет объектом сборки мусора).

[Из каждого из расписание методы:]

Вызывает исключение IllegalStateException, если [задача TimerTask] уже была запланирована или отменена, таймер был отменен или поток таймера завершен.

Если действительно существует много потоков, порожденных одним таймером, то это было бы ошибкой, которая маловероятна: убедитесь, что действительно используется только один объект Timer.

Последний вопрос о том, как объединить отдельные события в рабочий процесс, должен быть отдельным постом.

person Community    schedule 17.01.2013