2017-05-09 14 views
0

私は3種類のスレッドを持っています。メインスレッド、ワーカー、クライアント。 私はまた、2つのキュー、要求と応答キューを持っています。JAVA - 並行性 - マルチプロデューサ/マルチコンシューマの要求と応答キュー

メインスレッドは多くのクライアントを生成します。各クライアントは何かを要求し、それはメインのリクエストキューに追加する必要があります。メインは適切なワーカーを生成し、ワーカーはその要求を処理します。終了すると、[result、calling thread#]が応答キューに追加されます。各クライアントは、応答のために要求の後に待機します。これについてどうすればいいですか?

私はキューのためのconcurentリンクされたキューを使うべきだと思っています。これは大丈夫ですか? スレッドIDとポーリングが見つかるまで、クライアントはピックアップする必要がありますか?頭がピークとポーリングの間で変化するのはhypotehtically可能ですか?私は競合や遅延の多くがあるので、ロックを追加したくない。

これはスレッドセーフであり、同時であり、デッドロックや飢餓状態がないことが必要です。

+2

あなたはおそらく[mcve]を付けたいと思うでしょう。コードが何をしているのかを説明するだけの質問には、広範で非特定のレベルで答えにくいです。それを超えて:あなたはここで複数の質問をしています。もう一度やり直して、より具体的な質問をしてください。複数の質問がある場合は、いくつかの質問をしてください。 – GhostCat

答えて

0

私は単一の要求キューと、それから各クライアントのための別々の応答キューを持っています。作業者に送信された要求の一部として、クライアントの応答キューへの参照を入れて、クライアントが単一の応答キューを介して連続してpeak()になる必要がないようにします。

要求キューと応答キューの両方にBlockingQueuesを使用します。飢餓を解消するために、要求キューに高い容量(つまり、クライアントスレッドの数よりも大きい)を設定します。応答キューの容量は1つにすることができます。 peak()poll()の代わりにput()take()を使用してください。ここで

はシーケンスです:

  1. クライアントが要求を作成します。

  2. クライアントは要求キューに配置し、キューがいっぱいの場合はブロックします。 (これが要求キューの容量をより多くする理由です)。

  3. クライアントは、それ自身の応答キューとブロックで、それが空であるため、take()を呼び出します。

  4. ワーカースレッドが生成されたか、すでに空になっている要求キューで生成され、ブロックされました。

  5. ワーカースレッドは、要求キューから項目を削除して処理します。完了すると、要求に渡された応答キューへの参照を使用して、クライアントの応答キューに格納されます。

  6. これにより、クライアントのブロックが解除されます。クライアントは応答キューから応答を取り除き、それを処理します。

+0

ほとんどのセンテンスが "?"で終わるテキストによる質問に答えるおそらく正しいアプローチではありません。つまり、あなたは主に説明を求めています。それは有効な答えを構成していません! – GhostCat

+0

申し訳ありませんが、私は知っています。私はそれをコメントに入れますが、まだ50ポイントはありません。 –

+0

私はOPにコメントをしました。そして、あなたがコメントするのに50ポイントが必要なシステムは、目的に合っています。この制限を回避するために答えを使用すべきではありません。あなたの答えを削除してください...そうでなければ、それはちょうどチャーンを作成します。 – GhostCat

関連する問題