11

現在、プロデューサー/コンシューマー スレッドを作成しようとしています。プロデューサー スレッドは、考えられるすべての文字の組み合わせを調べて、それぞれの MD5 ハッシュを作成します。次に、各組み合わせとそのハッシュがHashMap<String,String>. Queue<>今、私の消費者スレッドでは、ハッシュマップでコレクションを使用できるようにしたいので、私の消費者スレッドはpoll()etc を呼び出して、値を atc のように削除しますQueueが、呼び出し時に組み合わせとそのハッシュの両方を表示する機能を引き続き提供しますpoll()。これを行うことについて?私は持ってHashMapいますが、キューとして「作成」またはキャストする方法がわかりません。ありがとう。

4

3 に答える 3

12

コードのスレッド セーフを処理せずに HashMap を使用しないでください。そうしないと、ライブロックで終了する可能性があります。

キーが挿入された順序で Map を反復できるようにするには、LinkedHashMap を使用できます。

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

プロデューサーは、次のようなエントリをプッシュします (特別なことはありません)。

m.put(key, object)

コンシューマーは、次のようなエントリをポーリングします。

while (someCondition) {
    Map.Entry nextEntry = null;

    // This block is equivalent to polling
    {
         synchronized(s) {
             Iterator i = s.iterator(); // Must be in the synchronized block
             if (i.hasNext()) {
                 nextEntry  = i.next();
                 i.remove();
             }
         }
    }

    if (nextEntry != null) {
         // Process the entry
         ...
    } else {
         // Sleep for some time
         ...
    }
    // process
}
于 2012-06-19T19:16:06.783 に答える
10

LinkedHashMapタイプはaHashMapとaの組み合わせのようなもので、Queueキーと値のペアを格納しますが、挿入された順序も記憶します。これはまさにあなたが探しているタイプかもしれません。明示的なpoll()関数はありませんが、イテレータを取得するLinkedHashMapと、追加された順序で要素にアクセスします。次に、次のような関数を作成できます。

public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
    assert !map.isEmpty();
    return map.iterator().next();
}

これにより、最初の要素が返されます。適切に同期するようにしてください。

Queueまたは、ヘルパークラスを定義し、キューにsをPair格納することで、キーと値のペアをa内に格納することを検討することもできます。Pair

お役に立てれば!

于 2012-06-19T18:53:24.287 に答える
4

EntrySet のキューを作成することをお勧めします -

Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
   queue.add(entry);
}

要素を配置できる別のタイプのキューの使用を検討できます。LinkedBlockingQueue などの空でない場合は、prdocuer のみが待機します
その後、プロデューサーは、必要に応じて EntrySet オブジェクトに基づいてマップを再構成できます。

于 2012-06-19T18:58:40.163 に答える