Я использую Timer и TimerTask для длительного опроса новых сообщений для приложения чата. Я хотел бы рассмотреть две «немного» разные возможности :
. 1:Таймер объявлен как локальная переменная
public List<MessageBean> getLastMessages(...) {
[...]
Timer timer = new Timer(true); //**Timer declared as local variable**
while (someCondiction) {
MessagesTimerTask returnMessagesTask = new MessagesTimerTask([...]);
timer.schedule(returnMessagesTask, 6000);
synchronized (listMessageBean) {
listMessageBean.wait();
//notify is called in the MessagesTimerTask which extends TimerTask
}
}
}
*Проблема:Каждый раз, когда я вызываю метод, я вижу, что создается новый поток, [Timer -1], [Timer -2] и т. д. И в окне отладки Eclipse все они, кажется, работают даже после getLastMessages (...)завершает работу и возвращает значение клиенту. Это может вызвать огромную проблему, если таймеры фактически используют потоки, и после нескольких транзакций сервер в конечном итоге потребляет все ресурсы компьютера.
2:Таймер объявлен как локальное поле
private final Timer timer = new Timer(true); //**Timer declared as local field**
public List<MessageBean> getLastMessages(...) {
[...]
while (someCondiction) {
MessagesTimerTask returnMessagesTask = new MessagesTimerTask([...]);
timer.schedule(returnMessagesTask, 6000);
synchronized (listMessageBean) {
listMessageBean.wait();
//notify is called in the MessagesTimerTask which extends TimerTask
}
}
}
*Проблема:каждый раз, когда я вызываю метод, используется один и тот же поток [Thread -1], но я не уверен, что если я сделаю два последовательных вызова, последний отменит/переопределит первый (, класс @Autowired by весна )?
Какие-либо предложения ? Спасибо.