複数のリーダーをサポートできるキューが必要
-
07-07-2019 - |
質問
複数のリーダーで処理できるキューが必要です。
リーダーは要素をデキューし、RESTサービスに送信します。
注意すべき重要な点:
- 各リーダーは異なる要素をデキューする必要があります。キューに要素A、B&がある場合C、スレッド1はAをデキューし、スレッド2はBをデキューする必要があります。そしてキューに何もないまで続きます。
- 常にビジーループで実行してアイテムのキューを覗くと、CPUに負荷がかかることを理解しています。したがって、ブロッキングキューが適切なオプションであるかどうかはわかりません。
私のオプションは何ですか?
解決
ConcurrentLinkedQueue または LinkedBlockingQueue は、ブロック動作が必要かどうかに応じて、すぐに思い浮かびます。
Adamskiが指摘しているように、 LinkedBlockingQueue
の take()
メソッドは、データの到着を待っている間にCPUサイクルを不必要に消費しません。
他のヒント
質問の説明から、スレッドが厳密なラウンドロビン方式で要素をデキューする必要があるかどうかわかりません。これが制限ではないと仮定すると、 BlockingQueue
の take()
メソッドを使用できます。これにより、データが利用可能になるまでスレッドがブロックされます(したがって CPU サイクル)。
また、 take()
の実装はアトミックであることに注意してください(例: LinkedBlockingQueue
): take()
で複数のスレッドがブロックされ、単一の要素がキューに入れられてからただ1つのスレッドのtake()呼び出しのみが返されます。もう一方はブロックされたままになります。
ConcurrentLinkedQueueとLinkedBLockingQueueの主な違いは、スループットです。中程度のスレッド競合下では、ConcurrentLinkedQueueは他のすべてのBlockingQueueを大幅に実行します。ただし、競合が激しい場合、BlockingQueueは競合するスレッドを待機中のスレッドセットに適切に配置するため、わずかに優れた選択肢です。