Java: потокобезопасная структура данных (очередь + карта) для хранения ожидающих сетевых запросов? - PullRequest
2 голосов
/ 27 апреля 2011

Мне нужно использовать какую-то структуру данных для хранения ожидающих сетевых запросов.

В идеале мне нужна очередь, которая также предлагает доступ к карте, поскольку в основном операции выполняются следующим образом:

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 ]

3 голосов
/ 27 апреля 2011

То, что вы описываете, выглядит очень знакомым для LinkedHashMap, который не синхронизирован, но он обеспечивает концепцию упорядочения и также сопоставляет ключ со значением.

1 голос
/ 27 апреля 2011

Так что я бы использовал очередь и карту, но потом Мне нужен способ удалить элементы в середина очереди, когда я получаю ответы не в порядке.

Если вы используете LinkedList в качестве своей очереди, вы можете воспользоваться его remove(Object o) методом. Очевидно, что вам необходимо гарантировать согласованность между картой и очередью, поэтому потребуется какая-то ручная синхронизация.

0 голосов
/ 27 апреля 2011

Посмотрели ли вы пакет java.util.concurrent, в частности ConcurrentSkipListMap? Вам просто нужно определить компаратор, который упорядочит их по времени вставки. ConcurrentSkipListMap

...