ExecutorService
プロデューサースレッドがN個の作業項目を生成し、それらをに送信してから、 N個の項目がすべて処理されるまで待機する必要があるという問題が2回発生しました。
警告
- Nは事前にはわかりません。もしそうなら、私は単にを作成し、すべての作業が完了するまで
CountDownLatch
プロデューサースレッドを作成します。await()
- 私のプロデューサースレッドはブロックする必要がありますが(つまり、を呼び出すことによって)、プロデューサースレッドの待機を停止させるために、すべての作業が完了したことを通知する方法がないため、を使用すること
CompletionService
は不適切です。take()
私の現在の好ましい解決策は、整数カウンターを使用し、作業項目が送信されるたびにこれをインクリメントし、作業項目が処理されるときにそれをデクリメントすることです。N個のタスクすべてを送信した後、プロデューサースレッドはロックを待機し、counter == 0
通知されるたびにチェックする必要があります。コンシューマースレッドは、カウンターがデクリメントされ、新しい値が0の場合、プロデューサーに通知する必要があります。
この問題へのより良いアプローチはありjava.util.concurrent
ますか、それとも「自分でローリング」するのではなく、使用すべき適切な構成がありますか?
前もって感謝します。