プロデューサ - コンシューマモデル(アイテムを生成する1つのスレッド、ブロッキングキューに入れるスレッド、エンドレスループでそれらを消費する別のスレッド)では、ループを中断させるポイズンオブジェクトを送信してスレッドをシャットダウンすることをお勧めします。プロデューサ - コンシューマモデルでキューをシャットダウンする最も効率的なオブジェクトは何ですか?
私の知る限り、これは使用して行うことができます。
null
は(一般的には落胆してBlockingQueue
によって禁止)- これまでプロデューサーによって作成されることはありません値(多分余分なテストを必要とし、いくつかの脳細胞を蒸発させる)
- ラッパー型であり、生成されたすべての値をプロパティとしてのみ値を含み、シャットダウンを示すためにnullに設定されたクラスに入れる(例:Guavaフレームワークの
Optional
)生成されたすべてのオブジェクトitem) - アイテムタイプとして使用されるクラスに特別なプロパティが追加されました(モデルがかなりフレキシブルになりません)
- poisonオブジェクトでのみ使用されるproducerによって作成されたタイプのサブクラス最終クラスであり、プライベートになることができる余分なクラスを必要とし、顕著なスペースを消費しないが、欠点である)。
- スレッドを中断してもキューをクリアできない。
私は、任意のキュー項目に対して型セーフなソリューションを探しています。
参照平等をチェックできる1つの特定の静的 'オブジェクト'を使用してみませんか?あなたのプロデューサのように、 'public static object POISON = new object();'を持ち、コンシューマで 'while(objFromQueue!= Producer.POISON){あなたのことをやってください} ... 'をチェックしてください。 – Fildor
なぜあなたは中断しませんか?プロデューサーと消費者? – SpaceTrucker
あなたが理解するのが一番簡単です。あなたはキューを閉鎖しています。 「最も効率的な」手段がいくつか見つかったら、数ナノ秒でどのような違いがありますか? –