0

配列などの固定バッファーに支えられた、スレッドセーフな無限ブロック fifo を探しています。セマンティクスは、複数の読み取りスレッドと書き込みスレッドが安全にアクセスできるということです。バッファーがいっぱいになると、ライターはブロックされ、最も古いアイテムが上書きされます。バッファーが空の場合、リーダーはブロックします。追加された合計と削除された合計のカウンターが内部バッファー サイズを 1 回または複数回ラップした場合、FIFO の順序付けを維持する必要があります。

興味深いことに、私がこれを探す通常の場所 (Java 独自の並行コレクション、コモンズ コレクション、グアバ) には、そのような「明白な」要件に対する即時の回答があるようには見えません。

4

5 に答える 5

3

あなたは実際にArrayBlockingQueueを記述しています。

これはスレッドセーフであり、まさにその目的のために設計されています。

  • キューがいっぱいの場合、ライターはスペースが空くのを待ちます
  • リーダーは、要素が利用可能になるまで必要に応じて、指定された待機時間まで待機できます
于 2013-02-18T08:29:44.110 に答える
0

java.util.concurrent.ArrayBlockingQueueはどうですか

于 2013-02-18T08:31:55.180 に答える
0

を探しているようですArrayBlockingQueue

于 2013-02-18T08:29:52.967 に答える
0

無限キューの場合、BlockingQueueキュー デリゲート (おそらく ) を使用してインターフェイスを実装する独自のクラスを作成する必要がありArrayBlockingQueueます。キューがいっぱいになったら、サイズを調整して、新しいより大きなデリゲートを作成します。MAX_INTこれは、リンクされたキュー (挿入されたオブジェクトごとにノードを作成する必要がある) に関連する GC オーバーヘッドまで無限であり、回避する必要があります。必要に応じて、デリゲートを縮小することもできます。

于 2013-02-18T09:35:12.403 に答える
0

無限のブロッキング キューを探しているのか、制限付きのブロッキング キューを探しているのかは明確ではありません。

  1. 制限付きブロッキング キュー: java.util.concurrent.ArrayBlockingQueue
  2. 無限ブロッキング キュー (RAM の制約によってのみ制限される): java.util.concurrent.LinkedBlockingQueue

すべてのケースで、ArrayBlockingQueue を使用することをお勧めします。

于 2013-02-18T08:39:05.470 に答える