Есть ли 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