複数のプロデューサーコンシューマーパターンプロデューサー1->コンシューマー1/プロデューサー2->コンシューマー2/プロデューサー3を使用します。各プロデューサーは完了サービスを使用しますが、終了時にロジックをコーディングする際に問題が発生します。
問題は、mainがプロデューサー1のキューにいくつかの(x)タスクを配置することです。これにより、プロデューサー1はプロデューサー2に(y)タスクを配置し、プロデューサー2はプロデューサー3にzタスクを配置します。x、y、zは異なるため、mainはzを認識していないため、プロデューサー3の完了キューを調べてz先物を取得することはできません。
そこで、3に初期化されたCountDownLatchと一緒にポイズンピルのアイデアを試しました。メインは、プロデューサー1にはx個のタスクしかないことを知っているので、最後にポイズンピルを送信できます。その後、プロデューサー1がこれを受け取ると、ラッチを減らしてポイズンを送信できます。プロデューサー2にピルを受け取り、プロデューサー2はラッチをデクリメントします。プロデューサー3に送信します。プロデューサー3がそれを受け取ると、ラッチをデクリメントします。mainはcountdownlatch.await()を実行するだけで、すべてのタスクが完了するまで続行できません。ただし、これは、各エグゼキュータサービスが1つのスレッドに制限されている場合にのみ機能します。これは、プロデューサーがポイズンピルを受け取ったときに、先行するすべてのタスクが開始され、完了していないことを意味するだけだからです。
それで、どうすればこれを回避できますか、私はどこかでより簡単な解決策を見逃しているに違いないと思います。