アトミックなロックフリーの方法でConcurrentLinkedQueueを使用したい:
複数の同時スレッドがイベントをキューにプッシュし、他のスレッドがそれらを処理します。キューはバインドされておらず、スレッドを待機させたりロックしたりしたくありません。ただし、読み取り部分は、キューが空になったことに気付く場合があります。ロックフリーの実装では、読み取りスレッドはブロックしてはなりませんが、そのタスクを終了し、他のタスクの実行を続行します (つまり、ExecutorService として)。したがって、最初の新しいイベントを空のキューにプッシュするライターは、それを認識し、リーダーを再起動して (つまり、新しい Runnable を ExecutorService に送信して) キューを処理する必要があります。2 番目または 3 番目のイベントを送信するそれ以降のスレッドは、一部のリーダーが既に準備/送信されていると想定する可能性があるため、気にしません。
残念ながら、ConcurrentLinkedQueue のadd()メソッドは常に true を返します。イベントを追加する前または後に isEmpty() をキューに問い合わせても、アトミックではないため役に立ちません。queue size() を監視するために追加の AtomicInteger を使用する必要がありますか、それともよりスマートなソリューションがありますか?
ディーター。