名前はありますが、私はそれが何であるかわからないので、Googleには難しいです。交換可能な作業キュー
私が探しているのは、キューのペア、プロデューサによって使用される「保留」キュー、および消費者が使用する「処理」キューであるJava並行性ユーティリティのものです。キューをアトミックにスワップします。この方法(1つのプロデューサスレッド、1つのコンシューマスレッド)で使用する場合、個々のキューはスレッドセーフである必要はなく、スレッドセーフである必要はありません。
私はこれまでどこかでこれを見てきたことは知っていますが、私はおそらくこのようなものを自分で作ることができます。
編集:私は私が探しているプリミティブはアトミックにスワップすることができ、原子参照のペアであると思います。 (。&私は自分自身をキューに追加することができます)
編集2: @Alex Miller氏は、それは私が考えていたが、覚えていなかったことだったかのしつこい質問に答えました。しかし、それはスレッドの壁であり、プロデューサーをブロックする必要がないので、私の問題は解決しません。
@ sfossinがキューへの参照を交換することについてのポイントは良いものです。私が望んでいたのは、消費者がキューからアイテムを取り出して処理し始めた瞬間、それらのキューアイテムはすべて完了しなければならず、プロデューサーはその後アイテムを追加できないということでした。プロデューサはもう一方のキューにアイテムを追加する必要があります。したがって、ペアになった/スワップされたアトミック参照のセットは機能しません。
(学校バスが2つあり、そのうちの1つは常に乗客を待っていて、もう1つはいつも他の場所に運んでいるのと同じようなものです。)一度ドライバーが離れると、別のバスに乗る必要があります既に残っているにも関わらず、プロデューサはバスにアクセスできますが、これは許可されていません)。
私は代わりに1台のConcurrentLinkedQueueを使用し、コンシューマがキューに追加するセンチネル値を使用します。これにより、1つだけではなく、複数のプロデューサが存在することが可能になります。消費者がキュー上のアイテムのバッチを処理するためには、コンシューマはキューに少なくとも1つのアイテムがあることを待ってから、キューに入れ、アイテムを削除します。その後、消費者はバッチ間で何をしなくても行います。それが私が望む行動です。
必ずしも保証されたノンブロッキングアプローチ(ロックまたはメソッドはオプションです)が必要なわけではありませんが、それを簡単に設計してアプリケーションに適用するのが簡単です。
を追加した後、私は、LockedQueueを考えていましたあなたが描いているように使用することができます。プロデューサーはq(pq)を持ち、消費者はq(cq)、lq.put(pq)を持ちます。 < - lq.get(cq)を実行する準備ができました。 < - バスで。 :P so 3 q、交換中のみロックします。 – sfossen