Java を使用してさまざまなパブリッシャー/サブスクライバー パターンを実装したいと考えていますが、現在アイデアが不足しています。
1 つのパブリッシャーと N 人のサブスクライバーがあり、パブリッシャーはオブジェクトをパブリッシュし、各サブスクライバーは各オブジェクトを 1 回だけ正しい順序で処理する必要があります。パブリッシャーと各サブスクライバーは、独自のスレッドで実行されます。
私の最初の実装では、各サブスクライバーには独自のブロッキング キューがあり、パブリッシャーはオブジェクトを各サブスクライバーのキューに入れました。これは正常に機能しますが、サブスクライバーのキューがいっぱいになると、パブリッシャーはブロックされます。これは、各サブスクライバーがオブジェクトの処理に異なる時間を要するため、パフォーマンスの低下につながります。
次に、別の実装では、パブリッシャーはオブジェクトを独自のキューに保持します。オブジェクトとともに、AtomicInteger カウンターがそこにあるサブスクライバーの数に関連付けられています。次に、各サブスクライバーはキューを確認してカウンターを減らし、カウンターがゼロになったらキューから削除します。
このようにして、パブリッシャーはブロックから解放されますが、サブスクライバーは、次のオブジェクトがピークされる前に、キューからオブジェクトを削除して、互いにオブジェクトを処理するのを待つ必要があります。
これを行うより良い方法はありますか?これはかなり一般的なパターンだと思います。