Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe ein Programm mit einer GUI (Thread 1).
Das Programm soll einen ServerSocket erstellen und Verbindungen verwalten. Das kann ich nicht im GUI Thread laufen lassen, da sonst der GUI Thread einfriert während der Socket beschäftigt ist. Also brauche ich einen zweiten Thread.
Mein Problem ist ein Verständnisproblem:
Einen zweiten Thread zu starten ist nicht das Problem, aber in meinem Verständnis arbeitet ein Thread die run - Methode ab und terminiert dann.
Ich hätte es jedoch gerne wenn der Thread unendlich lang laufen würde und ich verschiedene Methoden auf dem Thread aufrufen könnte.
Beispiel:
Socket-Thread hat Methoden:
- startServer();
- stopServer();
- sendMessage();
Die Methoden würde ich gerne aus dem GUI Thread aufrufen. Nur wie mache ich das?
zum ersten hast du von hausauf nicht nur einen Thread am laufen. Sobald du GUI
einsetzt hast du den "Main-Thread" und den "AWT-Dispatch" Thread.
Letzterer ist für die GUI da. Zum Beispiel um Manipulationen an der GUI vorzunehmen!
Das sollte man auch niemals selbst tun auch wenns an sich meist funktioniert.
Ein Thread oder Runnable terminiert grundsätzlich nach durchschreiten der methode.
Behelfen kannst du dich hier zum Beispiel mit einem Flag:
Java:
....
boolean end = false;
public void run(){
while(!end){
//ausführen
}
}
public void shutdown(){
end = true;
}
Übrigens auch die sauberste methode Threads zu beenden...
Threads aus der GUI zu starten is ja mal an sich nicht so tragisch aber dabei sollte
das Design stimmen... ich ahne da nämlich schreckliches...
Post mal n paar codeschnipsel dann können dir die Jungs und Mädels auch
schneller helfen!
Ja genau, für Threads die "unendlich" lange laufen sollen ist es normal "endlosschleifen" zu programmieren (die solange laufen bis das Programm beendet wird - siehe die flags oben).
Die Methoden die du dann aufrufst können ja dann auch flags verändern, auf die du in der Schleife dann immer reagierst.
Also am Ende dann sowas:
Java:
while(!end){
if(neuerClient!=null){willkommen(neuerClient);} // oder sowas, musst du dann wissen
}
Beim Arbeiten mit Threads sollte immer auch Synchronisierung betrieben werden. Es ist zwar unwahrscheinlich dass beim Setzen und Abfragen eines einfachen boolean was schief geht, aber nicht ganz ausgeschlossen. Die empfohlene Methode ist meines Wissens mittels isInterrupted() und Thread.interrupt() zu arbeiten. Da wird die Synchronisation schon gleich mit geliefert
Synchronisation zwischen Threads ist weder ganz einfach noch macht es Spaß, aber ist notwendig. Macht nämlich noch weniger Spaß, Fehler zu suchen wenn nicht mal ein Debugger benutzt werden kann (der zwar brav den aktuellen Thread am Breakpoint anhalten würde, aber dadurch würde der Fehler nicht mehr auftreten ;-) ).