2017-01-10 4 views
0

プロデューサ - コンシューマモデル(アイテムを生成する1つのスレッド、ブロッキングキューに入れるスレッド、エンドレスループでそれらを消費する別のスレッド)では、ループを中断させるポイズンオブジェクトを送信してスレッドをシャットダウンすることをお勧めします。プロデューサ - コンシューマモデルでキューをシャットダウンする最も効率的なオブジェクトは何ですか?

私の知る限り、これは使用して行うことができます。

  • nullは(一般的には落胆してBlockingQueueによって禁止)
  • これまでプロデューサーによって作成されることはありません値(多分余分なテストを必要とし、いくつかの脳細胞を蒸発させる)
  • ラッパー型であり、生成されたすべての値をプロパティとしてのみ値を含み、シャットダウンを示すためにnullに設定されたクラスに入れる(例:GuavaフレームワークのOptional)生成されたすべてのオブジェクトitem)
  • アイテムタイプとして使用されるクラスに特別なプロパティが追加されました(モデルがかなりフレキシブルになりません)
  • poisonオブジェクトでのみ使用されるproducerによって作成されたタイプのサブクラス最終クラスであり、プライベートになることができる余分なクラスを必要とし、顕著なスペースを消費しないが、欠点である)。
  • スレッドを中断してもキューをクリアできない。

私は、任意のキュー項目に対して型セーフなソリューションを探しています。

+1

参照平等をチェックできる1つの特定の静的 'オブジェクト'を使用してみませんか?あなたのプロデューサのように、 'public static object POISON = new object();'を持ち、コンシューマで 'while(objFromQueue!= Producer.POISON){あなたのことをやってください} ... 'をチェックしてください。 – Fildor

+0

なぜあなたは中断しませんか?プロデューサーと消費者? – SpaceTrucker

+4

あなたが理解するのが一番簡単です。あなたはキューを閉鎖しています。 「最も効率的な」手段がいくつか見つかったら、数ナノ秒でどのような違いがありますか? –

答えて

0

OKは、ここで私はどうなるのかです:

私はすべてのメッセージを実装する必要がありますインターフェイスを定義します:そして、ポイズン列挙型クラスを

public interface Message { 
    public default boolean continueProcessing() { 
     return true; 
    } 
} 

を:

public enum Poison implements Message { 
    INSTANCE; 

    @Override 
    public boolean continueProcessing() { 
     return false; 
    } 
} 

コンシューマコードは次のようになります。

@Override 
public void run() { 
    while (true) { 
     Message msg = queue.take(); 
     if (!msg.continueProcessing()) { 
      break; 
     } 
     doSomethingWith(msg); 
    } 
} 
0

毒薬を使用することができます。値は問題ではありません:

プロデューサー:

class Producer{ 
    public static final ItemType POISON = new ItemType(); 

    // rest goes here 
} 

消費者:

class Consumer{ 
    void run(){ 
     for(;;){ 
       ItemType item = queue.take(); 
       if(item == Producer.POISON) // <- not checking value of item here! 
        break; 
       handleItem(item); 
     } 
    } 
} 

また、これは、あなたのPOISONキャッシュされていないことを確認した場合にキャッシュされる整数のようなタイプで動作します。

あなたのItemTypeが実際に何かを知らないと、これは私があなたに提案することができる最高の(IMHO)です。ちょうど私の頭に浮かんだ


もう一つのアイデアは、これ以上の項目は、キューが空になった後に予想されていないことを示しているプロデューサーのフィールドを導入することであろう。これは、何らかの方法でコンシューマコードの空のキューをチェックすることを意味します。また、空のキューをブロックしてはいけないということを意味します。これを実装する際には多くのことを考慮する必要があります。

関連する問題