web-dev-qa-db-ja.com

JavaのBlockingQueueとしてBlockingMapはありますか?

BlockingQueueに非常によく似た1つのBlockingMapデータ構造が欲しいのですが。 BlockingQueueのtakeメソッドは、要素が使用可能になるまでそこで待機します。 BlockingMapのgetメソッドを、対応するキーが使用可能になるまでそこで待機させたいですか?この種のデータ構造を使用できますか?

20
zjffdu

私は過去に単にBlockingQueue<Map.Entry<K,V>>を使用しました。しかし最近、私はこれに出くわしました Javaのブロッキングマップ 。ただし、自分で使用したことはありません。

10

私は 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
4
Reuben

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);
    }
}
2
Ofri Mann