Есть ли BlockingMap как BlockingQueue в Java?

Я хотел бы иметь одну структуру данных BlockingMap, которая очень похожа на BlockingQueue. Метод take из BlockingQueue будет ожидать там, пока элемент не станет доступен. Я хотел бы, чтобы метод get BlockingMap ожидал, пока соответствующий ключ не станет доступен? Доступна ли такая структура данных, которую я могу использовать?

2 ответа

Решение

Я просто использовал BlockingQueue<Map.Entry<K,V>> в прошлом. Но недавно я наткнулся на эту карту блокировки для Java. Хотя сам этим не пользовался.

Вот чрезвычайно простая реализация, использующая BlockingQueue и ConcurrentHashMap:

public class BlockingMap<K, V> {
    private Map<K, ArrayBlockingQueue<V>> map = new ConcurrentHashMap<>();

    private BlockingQueue<V> getQueue(K key, boolean replace) {
        return map.compute(key, (k, v) -> replace || v == null ? new ArrayBlockingQueue<>(1) : v);
    }

    public void put(K key, V value) {
        getQueue(key, true).add(value);
    }

    public V get(K key) throws InterruptedException {
        return getQueue(key, false).take();
    }

    public V get(K key, long timeout, TimeUnit unit) throws InterruptedException {
        return getQueue(key, false).poll(timeout, unit);
    }
}

Я надеюсь, что это то, что вы хотите.

public class BlockingHashMap<K,V>
extends java.lang.Object
implements BlockingMap<K,V>

получить

public V get(java.lang.Object key)

Возвращает значение, которому сопоставлен указанный ключ, или значение NULL, если эта карта не содержит сопоставления для ключа. Обратите внимание, что null используется в качестве специального маркера, указывающего на отсутствие запрошенного ключа.

Указано:

get in interface java.util.Map<K,V>

Указано:

get in interface BlockingMap<K,V>

Параметры:

key - the key whose associated value is to be returned

Возвращает:

the value to which the specified key is mapped, or null if this map contains no mapping for the key

Броски:

java.lang.ClassCastException - if the key is of an inappropriate type for this map
java.lang.NullPointerException - if the specified key is null and this map does not permit null keys (optional)
java.lang.IllegalStateException - if the map has been shut-down
Другие вопросы по тегам