ich habe mal ein oder zwei Fragen zu einem aktuellen Problem.
Ich öffne in einem ersten Schritt ein Logfenster (JFrame mit einer JTextArea) und starte danach einen Thread. In diesem Thread lese ich Dateien ein und schreibe Fehler bzw. Erfolge eben in dieses Logfenster. Etwa so:
Im Hauptprogramm:
Code:
Log log = new Log();
log.setVisible(true);
MyThread mt = new MyThread(log);
mt.start();
while (mt.isAlive()){
Thread.sleep(1000);
}
log.println("FINISH");
Im MyThread
Code:
run{
log.println("...");
Datei einlesen ...
}
Das ganze funktioniert. Nur wird mir das Logfenster nicht angezeigt. Auf der Taskleiste sehe ich, dass das Fenster wohl geöffnet wird. Es wird jedoch nicht gezeichnet bzw. aktuallisiert. Nachdem der Import durch ist, sehe ich auch das Fenster, welches alle Fehler bzw. Erfolgsmeldungen enthält. Funktioniert also grundsätzlich.
Ich dachte: Dadurch das ich den ganzen Import in einen Thread ausgelagert habe würde das Fenster gezeichnet, dem ist aber nicht so.
Wenn wir einen neuen Thread starten und dann den laufenden Thread schlafen legen, bis der neue fertig ist (die übliche Methode dazu heißt übrigens "join()"), dann machen wir besser gleich alles im laufenden Thread :wink:
Wenn der laufende Thread aber der EventDispatchThread ist (das scheint hier der Fall zu sein), dann dürfen wir ihn natürlich weder schlafen legen noch lange Prozesse darin ausführen, sons blockieren wir die GUI. http://java.sun.com/docs/books/tutorial/uiswing/concurrency/
also der Thread wird quasi von einem JFrame aus einer Schleife heraus gestartet, etwa so:
JFrame:
Code:
for (...){
MyThread mt = new MyThread();
mt.start();
while (mt.isAlive){
...?
}
}
In der Schleife werden praktisch alle Dateien durchlaufen. Jetzt möchte ich natürlich erst den nächsten Thread starten, wenn der erste fertig ist daher das sleep. Mache ich das nicht, habe ich im Log die Meldungen unterschiedlicher Dateien durcheinander.
Wenn Dir also nur darum geht, die Aktionen in den Thread nacheinander auszuführen, dann verlagere die Schleife doch in den Thread. Dann musst Du aucht nicht den EventDispatchThread schlafenlegen.
es ist überflüssig, einen thread zu starten und dann im caller thread direkt nach dem aufruf zu warten, bis eben dieser thread fertig ist. dann kann man auch gleich auf den thread verzichten.