0

私が必要とするソケット接続からアイテムを読み取る Java アプリケーションでは (ここでは詳しく説明しない理由により)、

  1. それらの順序が保持されるように、単一のスレッドによって処理される入力項目。
  2. 他のアイテムがまだ処理されている間に新しいアイテムをソケットから読み取ることができるように、処理前にバッファリングされる入力アイテム。
  3. バッファがいっぱいである限りブロックされる読み取りスレッド

したがって、実際には、単一のワーカー スレッドを使用して、ソケットから受信したバッファリングされたアイテムを処理したいと考えています。そして、ワーカー スレッドとリーダー スレッドの間のバッファーとして適切なキューがありSynchronousQueue、FIFO 容量を備えた一種のフェアになります。

必要なキューは、満杯でない場合はArrayBlockingQueueまたはLinkedBlockingQueue容量あり のように動作し、満杯のSynchronousQueue場合のように動作する必要があります。

  1. putキューがいっぱいの場合にのみスレッドをブロックします
  2. takeキューが空の場合にのみスレッドをブロックします
  3. take満杯のキューでは、呼び出し元に次の FIFO 要素が与えられ、ブロックが解除され、put操作で待機している次のスレッドから要素が挿入されます
  4. put空のキューでは、操作で待機しているスレッドに要素を渡すか、要素をpoll挿入します

そのような既知の実装はありますか、それとも独自に展開する必要がありますか?

4

1 に答える 1

1

ArrayBlockingQueue を提案した投稿者からポイントを盗もうとするだけではない 1 つの答え:

2 つの ArrayBlockingQueues。「プール キュー」として機能する 1 つ - 起動時にバッファ オブジェクトで満たされます。もう 1 つは、処理中のスレッドが作業を待機するためのものです。

ソケット スレッドは、データをロードして処理スレッドのキューに入れる前に、プールからバッファーを取得する必要があります。処理スレッドは、データを処理した後、最終的に「使用済み」オブジェクトをプールに戻す必要があります。プールが空になると、いくつかのバッファが返されるまで、ソケット スレッドはそのプールをブロックします。

これにより、限定された処理キューと同じフロー制御が提供されますが、バッファーでの GC が回避されるという利点が追加されます。

于 2012-08-10T18:15:39.387 に答える