每次发送后端消息时,都会将其添加到JList,并且使用fireIntervalAdded刷新JList。问题是在一秒内可能会有20条消息到达,并且每条消息都会调用fireIntervalAdded。我想要做的是将List中的所有消息堆叠起来,并将一大堆数据发送给JList。我目前的解决方案似乎不工作,它总是发送一个消息,而不是一个大的堆栈:如何叠加传入数据
private class StackingListener implements MessageListener {
private List<Message> messages = new LinkedList<Message>();
private int waiting = 0;
@Override
public void messageReceived(MessageEvent event) {
stackData(event.getData());
}
private void stackData(Message data) {
messages.add(data);
if (waiting <= 0) {
waiting = 3;
new Thread(new Runnable() {
@Override
public void run() {
while(--waiting > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
List<Message> list = new ArrayList<Message>(messages);
messages.clear();
logger.info("Adding list with size of " + list.size());
controller.getListModel().addFullElements(list);
}
}).run();
} else {
waiting = 3;
}
}
}
我觉得我做的事情非常错误的。这个代码的想法是在线程正在休眠时堆叠消息。但似乎Thread.sleep停止了一切,不仅仅是当前的线程。
感谢
嗨,为什么你需要做所有这些等待?难道你不能将传入的消息堆叠在messageReceived事件的列表中吗?如果您正在使用多线程应用程序,则应考虑添加一些同步锁以保证数据的一致性。 – Felipe 2011-12-27 11:04:41