3

Ich habe dieses Stück Code, wo ich eine Arraylist mit einem Iterator bin durchqueren, wie:Java Modifizieren Liste gleichzeitig an verschiedenen Orten

Iterator iterator = list.iterator(); 
while (iterator.hasNext()) { 
    Element element = iterator.next(); 
    iterator.remove(); 
    handle(element) 
} 

wo'handle (Element Element) `wie geht:

ListIterator iterator = list.listiterator(); 
iterator.add(element); 

Nun gibt dies eine ConcurrentModificationException, da die iterator in der ersten Methode nicht mit dem neu hinzugefügten Element aktualisiert wird.

Ich habe dies derzeit mit einem CopyOnWriteArrayList gelöst, aber diese sind sehr teuer für die Leistung. Gibt es einen besseren Weg, das zu beheben?

Vielen Dank im Voraus!

(Anmerkung: das Beispiel keinen Sinn macht, wurde aber gemacht zu zeigen, was ich bin vor mit)


ich versuchen zu erklären, warum ich das tue:

  • ich habe eine Liste von ‚Befehlen‘ in meiner Hauptklasse, die

  • ausgeführt werden müssen ich habe eine while-Schleife (Code 1 im Beispiel), dass iteriert über diese Befehle und führen sie ein-für- auf e, während sie bei der Ausführung aus der Liste entfernt werden.

  • Beim Ausführen eines Befehls kann dieser Befehl der Liste einen neuen Befehl hinzufügen, der in meiner Hauptklasse gespeichert wird. (Das ist eigentlich ein bisschen komplizierter: die Behandlung eines Befehls erfordert eine Antwort vom Client, der wiederum mit einem Befehl antwortet, und dieser wird zur gespeicherten Liste hinzugefügt).

+2

Warum machst du das? Das heißt, warum versuchen Sie, die gleiche Liste mit zwei verschiedenen Arten von Iterator zu verarbeiten? – Makoto

+0

Können Sie versuchen, Ihr reales Beispiel oder eine vereinfachte Version davon zu erklären? –

+0

Ich habe versucht zu erklären, was ich versuche, so gut wie möglich zu tun (siehe Bearbeiten). Entschuldigung für die Verwirrung und danke für die Berücksichtigung! –

Antwort

5

die Anforderungen Da wie gesagt, die einfache Lösung ist es, ein Queue (javadoc) zu verwenden, anstatt ein List.

Ich habe eine Liste von ‚Befehlen‘ in meiner Hauptklasse, die

A Queue ausgeführt werden müssen, um eine Folge von Befehlen darstellen kann.

Ich habe eine while-Schleife (Code 1 im Beispiel), die über diese Befehle iteriert und sie nacheinander ausführt, während sie bei der Ausführung aus der Liste entfernt werden.

Das Äquivalent für eine Queue ist wiederholt remove() oder poll() oder dergleichen rufen Sie den ersten Befehl aus dem Queue zu erhalten und zu entfernen. Sie tun dies wiederholt, bis die Queue leer ist.

Beachten Sie, dass dies keine Iterator beinhaltet.

Während der Ausführung eines Befehls kann dieser Befehl der Liste, die in meiner Hauptklasse gespeichert ist, einen neuen Befehl hinzufügen.

die durch den Aufruf add() oder offer() getan werden kann, um einen Befehl zu dem Queue hinzuzufügen.


Beachten Sie, dass es viele verschiedene Implementierungen von Queue mit unterschiedlichen Eigenschaften:

  • Warteschlangen mit endlichen oder unendlichen Größen
  • Warteschlangen, die blockieren oder nicht blockieren
  • einfache FIFO-Warteschlangen versus LIFO-Warteschlangen oder Prioritätswarteschlangen
+0

Ich wusste nicht, dass Sie sicher über eine Warteschlange iterieren können, während Sie 'poll()' verwenden. Das ist genau das, wonach ich gesucht habe. Vielen Dank! Für diejenigen, die sich wundern: Ich habe meine Warteschlange als eine 'PriorityBlockingQueue' implementiert, da meine Befehle in verschiedenen Threads ausgeführt werden und die Warteschlange gleichzeitig ändern kann (daher würde 'PriorityQueue' nicht ausreichen). –

Verwandte Themen