我将使用Timer和TimerTask来进行聊天应用程序的长轮询以获取新消息。
我想要探讨两种“稍微”不同的可能性:
1: 将Timer声明为局部变量
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]等等。即使客户端getLastMessages(..)
结束运行并返回值后,在Eclipse Debug窗口中,这些线程似乎仍在运行。如果这些计时器确实使用了线程,并且经过几个事务之后,服务器最终将消耗所有的机器资源,则可能会导致巨大问题。
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],但我不确定如果我进行两个连续的调用,后一个会取消/覆盖前一个(该类由Spring @Autowired)?
有什么建议吗? 谢谢。