java:线程安全数据结构(队列+映射),用于存储待处理的网络请求?

时间:2011-04-27 15:27:11

标签: java data-structures concurrency map queue

我需要使用某种数据结构来存储待处理的网络请求。

理想情况下,我想要一个也提供Map访问的队列,因为操作基本如下:

interface PendingRequestStore<K, V>
{
    /* add item to queue with value v and key k */
    void add(K k, V v);
    /* remove and return value of first item in queue, or null if empty */
    V pollFirst();
    /* return the key of the first item in the queue, or null if empty */
    K getFirstKey();
    /* get item with key k, or null if absent */
    V get(K k);        
    /* remove and return value of item in queue with key k, or null if absent */
    V remove(K k);
}

目的是在发出待处理请求时存储它们;然后,当我收到回复时,我可以使用指定的密钥删除请求。响应通常不会按请求发送的顺序到达。如果我能保证及时响应,那么常规Map就足够了,但偶尔会出现故障,我还需要按照添加到队列中的顺序重新发送孤立请求。所以我使用队列一个映射,但是当我得到无序的响应时,我需要一种方法来删除队列中间的项目。

如果我无法避免同步,那么也可以使用并发数据结构。

有什么建议吗?


注意:密钥没有排序,所以有序的地图,例如ConcurrentSkipListMap不会帮助我。

3 个答案:

答案 0 :(得分:3)

您所描述的内容对于未同步的LinkedHashMap看起来非常熟悉,但它提供了排序的概念,并将键映射到值。

答案 1 :(得分:1)

  

所以我会使用队列和地图,但随后   我需要一种方法来删除中的项目   当我得到队列的中间部分   不合理的回复。

如果您使用LinkedList作为队列,则可以利用它的remove(Object o)方法。显然,您需要保证映射和队列之间的一致性,因此需要进行某种手动同步。

答案 2 :(得分:0)

你看过java.util.concurrent包,特别是ConcurrentSkipListMap吗?您只需要定义一个比较器,它将按插入时间对它们进行排序。 ConcurrentSkipListMap