invokeLater nicht threadsafe?

  • Themenstarter Themenstarter vanny
  • Beginndatum Beginndatum
V

vanny

Gast
Hmpf,

ich bin da wohl einem Irrtum erlegen.
Dass Swingkomponenten nicht threadsafe sind ist mir ja bekannt, und genau dafür gibt es ja eigendlich invokeLater/invokeAndWait.

Bisher habe ich es so gehalten, längere Berechnungen in einem neuen Thread zu starten und die jeweiligen GUI-Aktionen mit invokeLater an den EDT übergeben.(ist ja auch so gedacht)

Nun habe ich ein Programm geschrieben, das Daten aus der DB holt und diese dann in einer JList auflistet.
im
Java:
while(rs.next()){
//blabla Daten holen
//und dann:
SwingUtilities.invokeLater(new Runnable() {
				
				public void run() {
					datenModel.add(daten);
				}
			});

}

getestet und lost updates ohne Ende🙁

mit invokeAndWait jedoch funktioniert es, jedoch sehr langsam.
Hat jemand mal ne kurze und knackige Erklärung zur Hand, wie sich das nun wirklich mit dem invokeLater verhält?

Danke
und Gruß
Vanny
 
Was ist das 'daten' da? Wenn das eine Instanzvariable der Klasse ist, beachte, dass die bei jedem Schleifendurchlauf ersetzt wird, und die SwingUtilities (wegen invokeLater) dann ggf. 'daten' verwenden, die bereits durch neue ersetzt wurden). Im einfachsten Fall

Java:
while(rs.next()){
    ...
    final Daten dieDatenVonDiesemDurchlauf = daten; // Als finale, lokale variable speichern

SwingUtilities.invokeLater(new Runnable() {
                
                public void run() {
                    datenModel.add(dieDatenVonDiesemDurchlauf ); // Hier werden die richtigen Daten verwendet
                }
            });
 
}
 
invokeLaiter ist auch nur normales Multithreaed, wenn immer sich mehrere Threads daten teilen, muss synchrüssen diese daten synchronisiert werden.

datenModel wäre imho interessant.
 
inwiefern kommt es zu Lost Updates, wieso hängt das von invokeLater, invokeAndWait oder direkter Ausführung ab?
(edit: ok, Beispiel von Marco13 klingt nach sinnvoller Variante)


invokeLater ist schnell erklärt, die Aktion wird irgendwann, nicht gerade genau während eines Zeichenvorgangs, vom AWT-Thread ausgeführt,
das beinhaltet quasi auch schon das Ziel: nicht mit den paint-Mechanismen in Konflikt zu geraten, gleichzeitiges Durchlaufen von Collections, Daten usw.,

klingt nicht direkt nach 'Lost Update', höchstens Zeichenfehler oder ConcurrentModificationException (quasi auch Zeichenfehler),
deshalb die Frage zu Beginn
 
Ok,
Beispiel von Marco klappt wunderbar, ich hatte auch schon fast den richtigen Ansatz nur wohl mangels Erfahrung nicht bis zum Ende gedacht.

Mir ist wieder einiges klar geworden, vielen Dank euch.😀

@maki
Das "datenModel" heißt bei mir anders und ist mittlerweile recht komplex.
Es funktioniert ja fehlerfrei, mein Problem war der Denkfehler zwecks der Variablen.
Bei Bedarf kann ich ja heute Abend mal die relevanten Teile für´s Forum zusammenstecken, aber Beispiele dafür gibts hier ja eigentlich genug oder !?

Gruß Vanny

PS: ob datt mit Hansa watt wird:autsch:
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben