BlockingQueueに非常によく似た1つのBlockingMapデータ構造が欲しいのですが。 BlockingQueueのtakeメソッドは、要素が使用可能になるまでそこで待機します。 BlockingMapのgetメソッドを、対応するキーが使用可能になるまでそこで待機させたいですか?この種のデータ構造を使用できますか?
私は過去に単にBlockingQueue<Map.Entry<K,V>>
を使用しました。しかし最近、私はこれに出くわしました Javaのブロッキングマップ 。ただし、自分で使用したことはありません。
私は this があなたが望むものであることを願っています。
public class BlockingHashMap<K,V>
extends Java.lang.Object
implements BlockingMap<K,V>
get
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
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);
}
}