我需要使用某种数据结构来存储待处理的网络请求。
理想情况下,我想要一个还提供 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);
}
目的是在发出待处理的请求时存储它们;然后,当我收到响应时,我可以使用指定的 key 删除请求。响应通常不会按照请求发送的顺序到达。如果我可以保证及时响应,常规的 Map 就足够了,但偶尔也会出现故障,我还需要按照添加到队列的顺序重新发送孤立请求。因此,我会使用队列和 map ,但是当我收到无序响应时,我需要一种方法来删除队列中间的项目。
如果我无法避免同步,那也没关系,但最好也使用并发数据结构。
有什么建议吗?
注意:键没有顺序,因此有序映射例如ConcurrentSkipListMap
不会帮助我。
最佳答案
您所描述的内容对于不同步的 LinkedHashMap 看起来非常熟悉,但它提供了排序的概念,并且还将键映射到值。
关于java:用于存储挂起的网络请求的线程安全数据结构(队列+映射)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5806585/