オブジェクトのブロックキューがあります。
キューにオブジェクトができるまでブロックするスレッドを作成したいと思います。BlockingQueue.take()によって提供される機能に似ています。
ただし、オブジェクトを正常に処理できるかどうかわからないため、オブジェクトを削除せずに、peek()だけを実行したいと思います。オブジェクトを正常に処理できる場合にのみ、オブジェクトを削除したいと思います。
そこで、ブロッキングpeek()関数が必要です。現在、peek()は、javadocsに従って、キューが空の場合にのみ戻ります。
私は何かが足りないのですか?この機能を実現する別の方法はありますか?
編集:
スレッドセーフキューを使用して、代わりにピークしてスリープしたかどうかについて何か考えはありますか?
public void run() {
while (!exit) {
while (queue.size() != 0) {
Object o = queue.peek();
if (o != null) {
if (consume(o) == true) {
queue.remove();
} else {
Thread.sleep(10000); //need to backoff (60s) and try again
}
}
}
Thread.sleep(1000); //wait 1s for object on queue
}
}
コンシューマースレッドと(個別の)プロデューサースレッドが1つしかないことに注意してください。これはBlockingQueueを使用するほど効率的ではないと思います...コメントをいただければ幸いです。