非常に単純な生産者/消費者シナリオでjava.util.concurrent.BlockingQueueを使用しています。たとえば、この擬似コードは消費者の部分を表しています。
class QueueConsumer implements Runnable {
@Override
public void run() {
while(true)
{
try {
ComplexObject complexObject = myBlockingQueue.take();
//do something with the complex object
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
ここまでは順調ですね。ブロッキングキューのjavadocで、次のように読みました。
BlockingQueueは、アイテムが追加されないことを示すための「閉じる」または「シャットダウン」操作を本質的にサポートしていません。このような機能のニーズと使用法は、実装に依存する傾向があります。たとえば、一般的な戦術は、プロデューサーが特別なエンドオブストリームまたはポイズンオブジェクトを挿入することです。これらは、コンシューマーによって取得されたときにそれに応じて解釈されます。
残念ながら、使用されているジェネリックとComplexObjectの性質により、「ポイズンオブジェクト」をキューにプッシュするのは簡単ではありません。したがって、この「一般的な戦術」は、私のシナリオではあまり便利ではありません。
私の質問は、キューを「閉じる」ために他にどのような優れた戦術/パターンを使用できるかということです。
ありがとうございました!