每次發送後端消息時,都會將其添加到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