백엔드 메시지가 올 때마다 JList에이를 추가하고 fireIntervalAdded를 사용하여 JList를 새로 고칩니다. 문제는 1 초에 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