Asynchrones ändern einer Liste

Unicate

Erfahrenes Mitglied
Hallo alle zusamen!

Ich habe eine LinkedList<Long> mit ID's.
In einem Thread wird diese Liste durchiteriert (mit dem Iterator Interface, hasNext() usw.)

Es geht um das Laden von Elementen in einer Baumdarstellung. Diese besteht aus 2 Leveln. Catagory und Element.

Ich lade die Categories zuerst, da das laden der einzelnen Elemente recht lange dauert. Diese Categories kann man nun aufklappen und man sieht die einzelnen Elemente.

Die Liste mit Long-ID's stellen meine Category ID's dar, dessen Elemente nun geladen werden sollen.

Wenn ein User nun auf die letzte Category klickt, wird er diese erst zu spät zu gesicht bekommen, da alle anderen Categories zuerst geladen werden.

Meine Lösung:
Wenn ein User auf eine Category klickt, wird dessen ID in meiner Liste nach ganz oben geschoben, sodass die nächste Category die geladen wird definitiv die ist, die der Benutzer auch sehen möchte.

Meine Fragen:
Ist das sicher?
Der eine Thread iteriert die long liste um diese zu laden. Nun möchte ich aus einem anderem Thread die Liste verändern, während diese Iteriert.
[Edit:] Habs versucht, crashte beim ersten Versuch. Keine Lösung

Gibt es dafür eine andere Lösung?
 
Zuletzt bearbeitet:
Ohne jetzt genau zu begreifen, was Du da tust, würde ich es zunächst einfach mal mit Collections.synchronizedList(list) mir eine threadsichere Collections holen.
 
Wenn ein User nun auf die letzte Category klickt, wird er diese erst zu spät zu gesicht bekommen, da alle anderen Categories zuerst geladen werden.

Höh?

Ich verstehe das so, dass du zuerst den ersten Level, also die Kategorien darstellen willst. In einem zweiten Schritt willst du dann den zweiten Level, die Elemente, laden - das dauert relativ lange.
Jetzt hast du das Problem, dass du z.B. die letzte Kategorie aufklappen willst, das Programm aber noch mit den vorgängigen Elementen beschäftigt ist und die letzte Kategorie erst am Schluss geladen wird, und somit erst am Schluss angezeigt werden kann.

Also am Einfachsten geht's wohl, wenn du die Elemente gar nicht während einer Initialisierung lädtst, sondern nur, wenn der Benutzer das Leaf aufklappt.

Was du auch machen kannst, ist mit einem Stack arbeiten. Vor der Initialisierung pumpst du da alle Category-ID's rein. Die Initialisierung macht dann while(stack.pop != null)->KategorieID laden. Wenn der Benutzer jetzt ein Leaf aufklappt, lädtst du die ID vom Leaf, entfernst die ID vom Stack, und pushst die ID wieder rein, dann steht sie an oberster Stelle. Somit kannst du die Reihenfolge des Ladens beeinflussen. Die Klasse Stack selber ist ein Vector, also "quasi" thread-safe. Gleichzeitig verwendest du nur einen Thread, der über die Element-Liste iteriert, somit muss auf der Liste nicht thread-safe gearbeitet werden. Was aber wichtig sein könnte, ist, dass du bei der Manipulation (entfernen und hinzufügen) einen kompletten Lock auf den Stack machen musst. Dann könnte noch wichtig sein, dass du im "Initialisierungsthread" pro Iteration einen Thread.yield() machst, damit der GUI-Thread sicher den Lock überkommt. (Achtung, viel Konjunktiv ;P)

Gruss
slowy
 
Zurück