現在、プロデューサー/コンシューマー スレッドを作成しようとしています。プロデューサー スレッドは、考えられるすべての文字の組み合わせを調べて、それぞれの MD5 ハッシュを作成します。次に、各組み合わせとそのハッシュがHashMap<String,String>
. Queue<>
今、私の消費者スレッドでは、ハッシュマップでコレクションを使用できるようにしたいので、私の消費者スレッドはpoll()
etc を呼び出して、値を atc のように削除しますQueue
が、呼び出し時に組み合わせとそのハッシュの両方を表示する機能を引き続き提供しますpoll()
。これを行うことについて?私は持ってHashMap
いますが、キューとして「作成」またはキャストする方法がわかりません。ありがとう。
3 に答える
コードのスレッド セーフを処理せずに 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
}
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
お役に立てれば!
EntrySet のキューを作成することをお勧めします -
Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
queue.add(entry);
}
要素を配置できる別のタイプのキューの使用を検討できます。LinkedBlockingQueue などの空でない場合は、prdocuer のみが待機します。
その後、プロデューサーは、必要に応じて EntrySet オブジェクトに基づいてマップを再構成できます。