So entfernen Sie Elemente aus einer Warteschlange in Java mit einer Schleife
Ich habe eine Daten-Struktur wie diese:
BlockingQueue mailbox = new LinkedBlockingQueue();
Ich versuche, dies zu tun:
for(Mail mail: mailbox)
{
if(badNews(mail))
{
mailbox.remove(mail);
}
}
Offensichtlich der Inhalt der Schleife stören die Schranken, und ein Fehler wird ausgelöst, so würde ich in der Regel tun dies:
for(int i = 0; i < mailbox.size(); i++)
{
if(badNews(mailbox.get(i)))
{
mailbox.remove(i);
i--;
}
}
Aber leider BlockingQueue ist nicht eine Funktion zu erhalten oder entfernen Sie ein element vom index, also bin ich stecken. Irgendwelche Ideen?
Edit - Ein paar Klarstellungen:
Eines meiner Ziele ist die Aufrechterhaltung der gleichen Reihenfolge so knallen aus dem Kopf und legt es wieder in der Rute ist nicht gut. Auch, obwohl keine anderen threads zu entfernen wird E-mail aus einer mailbox, die Sie hinzufügen, um es, also ich möchte nicht in der Mitte von einem removal-Algorithmus, kann jemand schicken Sie mir eine mail, und dann haben Sie eine Ausnahme auftreten.
Vielen Dank im Voraus!
- überprüfen Sie die Antwort, die ich gepostet haben..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie pop
Umfrage
und drücken Siebieten
alle Elemente in der queue, bis Sie eine vollständige Schleife über die Warteschlange. Hier ist ein Beispiel:Beachten Sie, dass dieser Ansatz funktioniert nur, wenn dieser code ausgeführt wird, in einem einzigen thread und es gibt keinen anderen thread, der Elemente entfernt, die aus dieser Warteschlange.
Vielleicht müssen Sie prüfen, ob Sie wirklich wollen, um Abfragen oder nehmen Sie die Elemente aus, die BlockingQueue. Ähnlich wie für das Angebot und stellen.
Mehr info:
Anderen weniger buggy Ansatz ist die Verwendung einer temporären Sammlung, die nicht unbedingt gleichzeitig, und speichern Sie die Elemente, die Sie müssen noch in der Warteschlange. Hier ist ein kickoff-Beispiel:
peek
null zurück, wenn die Warteschlange leer ist (non-blocking)? In früheren version, wenn die Warteschlange leer war, vor dem betreten der Schleife, es würde geworfen haben eine NPE.peek
äquivalent-Methode, aber nach der überprüfung der Quell-code ist, gilt es eineReentrantLock
vor dem abrufen (aber nicht entfernen) das head-element in der Warteschlange.Ich sah über die Lösungen gepostet, und ich glaube, ich fand eine version, dient meine Zwecke. Was denkst du über diese?
Bearbeiten: Eine neue Lösung, kann problemlos. Was Sie Kerle denken?
Können Sie einfach implementieren queue für Ihren Bedarf. Und Sie müssen, wenn die API nicht über solche features.
Einer wie:
Den queue implementiert werden thread-sicher ist, ob push oder pop. Sie können auch Bearbeiten Sie die Warteschlange für weitere Operationen. Und es wird zulassen, den Zugang
removeBadMailsInstantly
Methode durch mehrere threads (thread-safe). Und Sie werden auch lernen Konzepte des multithreading.