複数のプロデューサーと単一のコンシューマーがいる状況があります。パフォーマンス上の理由から、私はコンシューマーがいかなる種類のブロッキングにもなりたくありませんが、より多くのプロデューサーが存在する可能性があるため、キューがいっぱいの場合は「ブロック」する必要があります。
そのような動作を提供するキューはありますか、または必要に応じて ArrayBlockingQueue を変更するにはどうすればよいですか?
ArrayBlockingQueue.poll
コンシューマーには非ブロッキングを使用ArrayBlockingQueue.put
し、プロデューサーにはブロッキングを使用します
BlockingQueue
実装の何が問題になっていますか? キューがいっぱいの場合、コンシューマーは非ブロッキングのブロックを呼び出すことができ、プロデューサーはどのブロックを呼び出すことができます。peek()
poll()
put(E e)
アップデート
キューが非常に集中的なタスクに使用されている場合、LMAX のディスラプター リング バッファーが最もパフォーマンスの高いキューイング構造である可能性があります。