在DefaultListModel与ConcurrentHashMap中存储数据



我正在swing中编写GUI来显示来自客户端的传入请求。服务器填充LinkedBlockingQueue,而当有可用数据时,另一个线程从队列中获取。请求存储为Object。像这样:

while(should_take) {
    //getRequest() is blocking
    Object request = server.getRequest();
    //Add request to user interface
    GUI.addToList(request);
}

现在我的问题来了,是不是这样更好:

解决方案1:

request存储在ConcurrentHashMap<Integer, Object>中,key作为请求的哈希值,value作为Object。然后,我将使用DefaultListModel来存储标识符(例如。请求类型)和哈希值。DefaultListModel将用于填充JList,有效地向用户显示请求。选择的请求的值(由用户选择)可以使用保存在DefaultListModel中的散列从ConcurrentHashMap中检索。

一些示例代码:

ConcurrentHashMap<Integer, Object> requests = new ConcurrentHashMap<>();
DefaultListModel listData = new DefaultListModel();
JList theList = new JList();
...
public void addToList(Object request) {
    //Place in HashMap
    requests.put(request.hashCode(), request);
    //Create a DataHolder with the Hashvalue and identifier of the request
    DataHolder holder = new DataHolder(request.getID(), request.hash);
    //Add the element to the ListModel
    listData.addElement(holder);
    //Assign the list model to the JList
    theList.setModel(listData);
}

当用户在列表中选择一个项目时:

DataHolder holder = (DataHolder)theList.getSelectedValue();
//Get request from HashMap
Object request = requests.get(holder.getHash());
//Do something with request

解决方案2:

我用请求标识符和请求值填充一个新对象,称之为DataHolder。现在,我可以用包含DataHolderDefaultListModel填充JList,并且不需要引用任何其他数据结构来检索实际的请求值。因为DefaultListModel是用来填充JList的,我觉得它会影响性能,可能会导致列表填充/取消填充的速度变慢。

一些示例代码:

DefaultListModel listData = new DefaultListModel();
JList theList = new JList();
...
public void addToList(Object request) {
    //Removed HashMap
    //Create a DataHolder with the Hashvalue and *actual value* of the request
    DataHolder holder = new DataHolder(request.getID(), request);
    //Add the element to the ListModel
    listData.addElement(holder);
    //Assign the list model to the JList
    theList.setModel(listData);
}

当用户在列表中选择一个项目时:

//No more HashMap
DataHolder holder = (DataHolder)theList.getSelectedValue();
Object request = holder.getData();
//Do something with request

哪种解决方案会产生更快的结果?有没有更有效的方法?对于此事的任何帮助,我将不胜感激。

更多信息:

  • 请求可以以突发方式发送。(每次爆发50+)
  • 请求将包含20到50行XML
  • 请求将从数据结构中随机删除
编辑:

将消息添加到列表的序列现在已经封装在invokeLater中。在我的实现中,每次将消息添加到列表中时,都会创建一个新线程来完成所有工作,并在消息进入列表后结束。这当然会影响答案。如果连续创建50个线程(每次调用addToList), 哪个解决方案执行得更快?

方案三:扩展SwingWorker

class MessageWorker extends SwingWorker<List<DataHolder>, DataHolder> {}

在你的doInBackground()的实现中,publish()成为可用的中间结果。在process()的实现中,更新视图组件的模型。方便的是,SwingWorker将以可持续的速度合并publish()调用。配置您的应用程序以进行验证。

相关内容

  • 没有找到相关文章

最新更新