2016-07-13 27 views
0

我正在使用Java。我需要将数据发布到FIFO队列。该队列将由一个单独的线程处理。这样我就避免了阻塞主线程。 关于发布数据我的使用情况是: -是否有FIFO队列根据某些条件提供唯一性

  • 每个数据对象都有一个字段,它标识它唯一地..所以有50个奇数这样的“密钥”。还有其他字段是对象的其余数据。
  • 如果一个新的数据对象出现时,它不应该盲目地插在队列中,但应该取代旧.. 只有如果基于现场对比等他们的数据是不同的..否则将会被丢弃。请记住,其中一个领域是关键..休息是数据,可以大大不同。
  • 这些数据必须在FIFO的基础上处理..因此我需要一个队列类型。
  • 不用说,它也应该是线程安全的。

任何人都知道满足这些标准的任何数据结构?谢谢。

+0

如果更新应该替换现有的条目,新的条目会进入队列中的旧位置,还是旧的位置会从队列中删除,并且新位置会在末尾添加? – jtahlborn

+0

另外,你期望什么样的并发性能? – jtahlborn

+0

由于您的队列中最多只有50个元素,因此您可能最有可能在某些同步块中获得简单的列表包装。除非你需要极高的并发水平。 – jtahlborn

回答

0

当我不得不在C#中这样做时,我创建了一个包含Dictionary和Queue的自定义数据结构。词典由项目键索引,并且该值包含与键相关联的数据。队列仅包含密钥。

要插入一个项目到队列中,我做了以下(伪)

lock the data structure 
    if key exists in dictionary 
     replace old item data in dictionary with new item data 
    else 
     add new item to the dictionary, indexed by key 
     add new item key to the queue 
release lock 

出列一个项目:

lock 
    remove first item key from queue 
    lookup data for that key in dictionary 
    remove item from dictionary 
release lock 
process the item 

我们做了成千上万的更新在多个线程第二,和没有遇到任何性能问题。这些锁不会持续很长时间。当然,你的里程可能会有所不同。

您可以通过添加主线程可以推送更新的无锁并发队列来避免锁定主线程。另一个线程可以为该队列提供服务,并将项添加到上述的混合词典/队列结构中。