Ist schon ein bischen her seit ich das letzte Mal Java benutzt habe, aber ich denke der Haupthread existiert so lange wie der Java Prozess läuft.
In Bezug auf die beiden Invoke Varianten würde ich davon ausgehen, dass beide das selbe "Invoke Event" benutzen, um den Aufruf an aktuell letzter Stelle in die Eventqueue einzuhängen.
D.h. der Eventthread wird das Invoke genau so behandlen als wäre eine Benutzerinteraktion zu diesem Zeitpunkt eingegangen, d.h. das Runnable.run() wird aufgerufen, sobald der Eventhread an diesem Punkt seiner Verarbeitungswarteschlange angelangt wird.
Im Falle der "AndWait" Variante wird das Abarbeiten der Events einfach direkt angetrieben, während im der Variante ohne Wait einfach der Haupteventschleife die Kontrolle überlassen wird.
In stark vereinfachter Form sieht das in etwa so aus
Ciao,Code:// run des Eventthread void run() { while (true) { Event event = getEventFromQueue(); processOneEvent(event); } } void processOneEvent(Event event) { if ( event instanceOf EventA ) { processEventA( (EventA) event ); } else if ( event instanceOf EventB ) { processEventB( (EventB) event ); } else if ( event instanceOf InvokeEvent ) { processInvoke (Invoke) event ); } } void processInvoke(InvokeEvent event) { Runnable runnable = event.getRunnable(); runnable.run(); } void processEventA(EventA event) { invokeLater(new Runnable() { ... } ) } void processEventB(EventB event) { invokeLaterAndWair(new Runnable() { ... } ) } void invokeLater(Runnable runnable) { InvokeEvent invokeEvent = new InvokeEvent( runnable ); putEventIntoQueue( invokeEvent ); } void invokeLaterAndWait(Runnable runnable) { InvokeEvent invokeEvent = new InvokeEvent( runnable ); putEventIntoQueue( invokeEvent ); // so weit gleich wie invokeLater // jetzt lokal Eventverarbeitung durchführen bis unser Event dran war while (true) { Event event = getEventFromQueue(); processOneEvent(event); if (event == invokeEvent) break; } }
_
Lesezeichen