1

Producer-Consumer デザイン パターンを適用するアプリケーションがあります。IT は Java で書かれています。つまり、生産者は項目をブロッキング キューに入れ、消費者はそこから項目を取り出します。コンシューマーは、プロデューサーから停止の合図があるまで実行する必要があります。

この信号を生産者から消費者に届ける最も適切な方法は何ですか? チーフ デザイナーは、プロデューサーとコンシューマーを分離したいと言いましたが、コンシューマー スレッド プールでメソッドを呼び出す以外に何も見当たりませんか?

4

3 に答える 3

2

チーフプログラマーは正しいです。それらを別々に保つことは、優れた高度に分離されたコードにつながります。

これを行うにはいくつかの方法があります。それらの1つはポイズンピルと呼ばれます。これがどのように機能するかです - コンシューマーがそのアイテムを見て、彼らが自殺するか、別のアクションを実行したときに、既知のアイテムをキューに配置します。

複数のコンシューマー (ThreadPool について言及しました) または制限されたキューがある場合、これは注意が必要です。これについては、Joshua Bloch による Java Concurrency in Practice を参照してください。彼はそれを最もよく説明しました。

于 2013-05-13T02:45:41.230 に答える
1

キューを介してキャンセル メッセージを送信します。あなたの消費者のrun方法は次のようになります

while(true) {
    Message message = queue.take();
    if(message == Message.Cancel) {
        queue.offer(message); // so that the other consumers can read the Cancel message
        break;
    }
}
于 2013-05-13T02:44:10.217 に答える
0

ConsumerHalter クラスを作成します。キューからデータを取得したいすべてのコンシューマーを ConsumerHalter クラスに登録し、プロデューサーが ConsumerHalther クラスで停止イベントをトリガーするようにします。その後、ConsumerHalter クラスは各コンシューマの onStopConsuming() を呼び出します。

于 2013-05-13T02:55:02.053 に答える