私はオブジェクトのブロッキングキューを持っています。java BlockingQueueにブロッキング・ピークがありませんか?
キューにオブジェクトがあるまでブロックするスレッドを作成したいと思います。 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つのコンシューマスレッドと1つの(別の)プロデューサスレッドしか持たないことに注意してください。私はこれがBlockingQueueを使用するのと同じくらい効果的ではないと思います...
これは良い提案です。私がここで見ることができる唯一の問題は、アイテムを処理している間にキューがいっぱいになると、現在のアイテムをキューに戻すことができなくなるということです。 – rouble
ラッパーの実装で追加の同期を使用することでこれを得ることができます。したがって、take +アトミック操作を実行します。無制限のキューを使用することもできます。 – Adamski
キューの状態の変更を他のスレッドに公開することが難しいため、削除と再追加をお勧めします。おそらくpeek()を実装するために多忙なポーリングを使用するかもしれません。またはポーリングしたくない場合は、ラッパーのキューに関連付けられたセマフォを使用してください。 –