は今、私はプロデューサ/コンシューマスレッドを作成しようとしています、生産者スレッドは、文字のすべての可能な組み合わせを経由して、それぞれのMD5ハッシュを作成します。次に、各組み合わせとそのハッシュはHashMap<String,String>
に入れられます。今私の消費者のスレッドで私は消費者のスレッドがQueue
のようにATCが、それでも私にpoll()
を呼び出すときに組み合わせ、そのハッシュの両方を見ての機能を与えるため、値を削除poll()
などを呼び出すことができますので、ハッシュマップ上Queue<>
コレクションを使用できるようにしたいですこれをどうやってやりますか?私はHashMap
を持っていますが、キューを作成する方法やキューに入れる方法は知られていません。おかげさまで HashMapのキューを作成することは可能ですか?
答えて
あなたはあなたのコードのスレッドの安全性を処理せずにHashMapを使用しないでください。それ以外の場合は、ライブロックで終了することがあります。
キーが挿入された順序でマップを反復できるようにするには、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
タイプHashMap
とQueue
の組み合わせのようなものである - それは、キー/値ペアを格納するだけでなく、それらが挿入された順序を覚えています。これはまさにあなたが探しているタイプかもしれません。そこには明示的なpoll()
機能はありませんが、あなたはLinkedHashMap
Iteratorを取得する場合、あなたは彼らが追加された順序で要素を訪問します。おそらく、次のような関数を書くことができます:
public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
assert !map.isEmpty();
return map.iterator().next();
}
これは最初の要素を返すでしょう。適切に同期するようにしてください。
また、Queue
の中にキー/値のペアを格納することを検討するには、ヘルパークラスPair
を定義し、Pair
をキューに格納します。
希望すると便利です。
ニースを、ので、彼はちょうどに、いくつかのSyncObjectが必要になりますコンシューマ側でLinkedHashMapから読み込むことが可能なときにシグナルを送出します。 –
こんにちは、のLinkedHashMapはスレッドセーフではありません、それはタイプ待ち行列のではありません。 – sperumal
@ sperumal-私はこれらのいずれかが事実であると断言したことはありません。私は、OPが同期コードを供給すると仮定しました。また、 'Queue'型でなければならないという要件はないと私は信じています。 OPの質問はこれを決して言及しない。これが要件である場合、このアプローチは間違いなく機能しません。 – templatetypedef
私はあなたのentrySetのキューを作成示唆 -
Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
queue.add(entry);
}
あなたは要素、およびなどLinkedBlockingQueueなどの非空の場合のみprdocuerの待機を置くことができますされ、キューの別のタイプを使用して検討することができます。
プロデューサは、次いで、必要に応じて、オブジェクトのentrySetに基づいてマップを再構成することができるであろう。
これは良い方法のように思えます。ありがとう、私はそれを試してみましょう。 1つの質問は、このスレッドセーフですか? –
- 1. `* const Any`型のものでキーイングされた` HashMap`を作成することは可能ですか?
- 2. LinearLayoutsのGridVIewを作成することは可能ですか?
- 3. CMDでゲームを作成することは可能ですか?
- 4. Subversionでカスタムフックイベントを作成することは可能ですか?
- 5. WinRTサービスを作成することは可能ですか
- 6. 電子メールフックを作成することは可能ですか?
- 7. Bazaarにサブブランチを作成することは可能ですか?
- 8. カスタムToolBarItemを作成することは可能ですか
- 9. TFS SDKを使用してビルドを作成、キュー、および追跡することは可能ですか?
- 10. は、アンドロイドでミラーアプリケーションを作成することは可能です
- 11. HTMLコードにhashmap変数を設定することは可能ですか
- 12. WPF - このバインディングを作成することは可能ですか?
- 13. Vimでコマンドをキューに入れることは可能ですか?
- 14. イベントを作成する場所はどこですか?可能?
- 15. WordpressのブログからPhoneGapアプリを作成することは可能ですか?
- 16. ActionScriptでHTMLからPDFを作成することは可能ですか
- 17. VisualBrushからWPFでカーソルを作成することは可能ですか?
- 18. VB.NETで共通のデータベースクラスを作成することは可能ですか?
- 19. HazelcastでWAN全体のトピックを作成することは可能ですか?
- 20. 絶対ではないUriを作成することは可能ですか?
- 21. MVC3では、再利用可能な関数をビューで作成することは可能ですか?
- 22. 同じ行にレイアウトとビューフリッパーを作成することは可能ですか?
- 23. Java、Androidでプログラムで画像を作成することは可能ですか?
- 24. Amazonキュー - 文字列ではなくXMLオブジェクトをキューに渡すことは可能ですか?
- 25. WebサービスからAPEXトリガーを作成することは可能ですか?
- 26. ファイルシステム(* .xmlファイル)からVectorDrawableを作成することは可能ですか?
- 27. Facebookページの作成日時を取得することは可能ですか?
- 28. facebookグループのアプリを作成することは可能ですか?
- 29. AndroidのようにTableLayoutを作成することは可能ですか?
- 30. RubyのCrystalバインドを作成することは可能ですか?
これは魅力的なものでした。ありがとうございました。 –