Ich habe eine blockierende Warteschlange von Objekten.java BlockingQueue hat keinen blockierenden Blick?
Ich möchte einen Thread schreiben, dass Blöcke, bis es ein Objekt in der Warteschlange ist. Ähnlich der Funktionalität von BlockingQueue.take().
Da ich jedoch nicht weiß, ob ich in der Lage sein werde, das Objekt erfolgreich zu bearbeiten, möchte ich nur kurz() sehen und das Objekt nicht entfernen. Ich möchte das Objekt nur entfernen, wenn ich es erfolgreich verarbeiten kann.
So möchte ich eine Blockierung peek() Funktion. Derzeit wird peek() nur zurückgegeben, wenn die Warteschlange gemäß den Javadocs leer ist.
Fehle ich etwas? Gibt es eine andere Möglichkeit, diese Funktionalität zu erreichen?
EDIT:
Irgendwelche Gedanken auf, wenn ich nur einen Thread sichere Warteschlange verwendet und guckte und schlief stattdessen?
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
}
}
Beachten Sie, dass ich nur einen Consumer-Thread und einen (separaten) Produzenten-Thread habe. Ich denke, das ist nicht so effizient wie mit einer BlockingQueue ... Alle Kommentare geschätzt.
Dies ist ein guter Vorschlag. Das einzige Problem, das ich hier sehen kann, ist, dass, wenn die Warteschlange während der Verarbeitung eines Elements voll wird, ich das aktuelle Element nicht in die Warteschlange stellen kann. – rouble
Sie könnten dies umgehen, indem Sie zusätzliche Synchronisation in Ihrer Wrapper-Implementierung verwenden, wodurch Take + eine atomare Operation wird. Sie können auch eine unbegrenzte Warteschlange verwenden. – Adamski
Ich würde empfehlen, nicht zu entfernen und neu hinzufügen, denn dann haben Sie die Mühe, die Statusänderungen der Warteschlange anderen Threads auszusetzen. Verwenden Sie möglicherweise ein beschäftigtes Polling, um den Peek() zu implementieren. Oder verwenden Sie einen Semaphor, der an die Warteschlange in Ihrem Wrapper gebunden ist, wenn Sie nicht abfragen möchten. –