我需要使用某种数据结构来存储待处理的网络请求。
理想情况下,我想要一个也提供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
不会帮助我。
答案 0 :(得分:3)
您所描述的内容对于未同步的LinkedHashMap看起来非常熟悉,但它提供了排序的概念,并将键映射到值。
答案 1 :(得分:1)
所以我会使用队列和地图,但随后 我需要一种方法来删除中的项目 当我得到队列的中间部分 不合理的回复。
如果您使用LinkedList作为队列,则可以利用它的remove(Object o)
方法。显然,您需要保证映射和队列之间的一致性,因此需要进行某种手动同步。
答案 2 :(得分:0)
你看过java.util.concurrent包,特别是ConcurrentSkipListMap吗?您只需要定义一个比较器,它将按插入时间对它们进行排序。 ConcurrentSkipListMap