Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:用于存储挂起的网络请求的线程安全数据结构(队列和映射)?_Java_Data Structures_Concurrency_Map_Queue - Fatal编程技术网

java:用于存储挂起的网络请求的线程安全数据结构(队列和映射)?

java:用于存储挂起的网络请求的线程安全数据结构(队列和映射)?,java,data-structures,concurrency,map,queue,Java,Data Structures,Concurrency,Map,Queue,我需要使用某种数据结构来存储挂起的网络请求 理想情况下,我希望队列也提供地图访问,因为操作基本如下: 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

我需要使用某种数据结构来存储挂起的网络请求

理想情况下,我希望队列也提供地图访问,因为操作基本如下:

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);
}
接口PendingRequestStore
{
/*使用值v和键k将项目添加到队列*/
无效添加(K,V);
/*移除并返回队列中第一项的值,如果为空,则返回null*/
V pollFirst();
/*返回队列中第一项的键,如果为空,则返回null*/
K getFirstKey();
/*获取键为k的项,如果缺少,则为null*/
V-get(K);
/*移除并返回带有键k的队列中项目的值,如果不存在,则返回null*/
V移除(K);
}
目的是在发送挂起的请求时存储它们;然后,当我得到响应时,我可以使用指定的密钥删除请求。响应通常不会按照请求发出的顺序到达。如果我能保证及时响应,一个常规的
映射就足够了,但是偶尔会出现故障,我还需要按照孤立请求添加到队列的顺序重新发送它们。所以我会使用一个队列和一个映射,但是我需要一个方法来移除队列中间的项目,当我得到的是无序的响应。
如果我不能避免使用synchronized,那也没关系,但是也可以使用并发数据结构

有什么建议吗


注意:钥匙没有顺序,因此顺序地图(例如)对我没有帮助

所以我会使用队列和地图,但是 我需要一种方法来删除中的项目 当我到达队列中间时 不符合顺序的响应


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

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

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

查看
java.util.concurrent
包中的集合类。?哪一个?我对w/j.u.c有点熟悉,在这种情况下它们似乎都不可用。好的旧LinkedHashMap,
Map m=Collections.synchronizedMap(新LinkedHashMap(…)
?嗯。它有
add
get
remove
;如何实现
getFirstKey()
和原子的
pollFirst()
?为什么它们需要迭代到最后?另外,pollFirst需要我手动同步。无论如何,有一些可能性…嗯。。。这意味着我需要在我的数据中添加一个时间戳字段;我宁愿避免这种情况,但你有一点。或者你可以使用原子长度作为计数器。不过,效率是这里的问题。+1。我不知道有哪一个并发类在这里会有帮助,所以我会转而使用LinkedHashedMap和您自己的同步。getFirstKey()和pollFirst()可以通过(同步的)代码实现:检查映射是否为空;使用迭代器()。