我正在使用 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 spring ) ?
有什么建议么 ?谢谢你。