Hey,
Ja, du hast richtig gelesen: Ich habe ne Verständnisfrage zur Klasse ServerSocket oder zum EDT. Gut dass das nicht komplett verschiedene Dinge sind nicht wahr
Dummerweise kann ich nicht mal ausmachen was von beidem hier eigentlich relevant ist... Vllt beides?!
Okay also folgende Zeile:
Wirft ne BindException wenn da schon "dicht" gemacht wurde,d.h. diese ServerSocket-Instanz bereits erzeugt wurde. Wird oft im Netz vorgeschlagen als Ansatz für One-Instance-Apps, also Programme die man als User immer nur einmal zur selben Zeit starten kann. Die Idee ist eben dass die zweite Instanz beim Start in die Exception rennt, da die erste Instanz eben den Bind hält.
Nun zu meinem Problem damit:
Ich hatte das schon mal erfolgreich bei einer meiner Apps verwendet. Jetzt wollte ich das für ne andere App wieder verwenden und stellte fest: Es geht nicht ???:L Nach viel Kopfrauchen und Rumprobieren habe ich festgestellt dass es wohl etwas damit zu tun hat wann genau das gemacht wird bzw wie es grad so mit den Threads des Prozesses ausschaut. Und hier kommt der EDT ins Spiel.
Konkret:
Ich hab obige Zeile in meiner main(), gleich am Anfang. Danach wird per invokeLater meine GUI gebaut und angezeigt. Wie sich nun herausgestellt hat: Wenn mein Frame angezeigt wird bevor das Ende der main() erreicht wird, dann funktioniert das. Beim Versuch meine App erneut zu starten fliegt die BindException, alles ok.
Wird das Ende der main() aber erreicht und mein Frame wird noch nicht angezeigt, dann wird der Bind zu diesem Zeitpunkt anscheinend aufgelöst, denn dann funktioniert das nicht und ich kann meine App hundertfach starten. Komisch, denn meine App wird ja in so einem Fall trotzdem nicht komplett beendet, der Code den ich per invokeLater auf den EDT lege wird ja immer ausgeführt, und meine App läuft... Ist ja nicht so, dass das Programm terminiert wenn das Ende der main() erreicht wird aber der Code vom invokeLater noch nicht aus der Queue geholt wurde. Das passiert ja immer.
Aber für diese ServerSocket Geschichte macht das scheinbar nen Unterschied. Also... ka woran liegt das nun. Eigenart von ServerSocket? Oder kapier ich hier generell etwas nicht darüber wie/wann eine App eigentlich feststellt ob sie beim Ender der main() terminieren muss oder irgendein Thread vom EDT läuft/gleich laufen wird??
Ja, du hast richtig gelesen: Ich habe ne Verständnisfrage zur Klasse ServerSocket oder zum EDT. Gut dass das nicht komplett verschiedene Dinge sind nicht wahr
Okay also folgende Zeile:
Java:
new ServerSocket(14231, 0, "localhost");
Wirft ne BindException wenn da schon "dicht" gemacht wurde,d.h. diese ServerSocket-Instanz bereits erzeugt wurde. Wird oft im Netz vorgeschlagen als Ansatz für One-Instance-Apps, also Programme die man als User immer nur einmal zur selben Zeit starten kann. Die Idee ist eben dass die zweite Instanz beim Start in die Exception rennt, da die erste Instanz eben den Bind hält.
Nun zu meinem Problem damit:
Ich hatte das schon mal erfolgreich bei einer meiner Apps verwendet. Jetzt wollte ich das für ne andere App wieder verwenden und stellte fest: Es geht nicht ???:L Nach viel Kopfrauchen und Rumprobieren habe ich festgestellt dass es wohl etwas damit zu tun hat wann genau das gemacht wird bzw wie es grad so mit den Threads des Prozesses ausschaut. Und hier kommt der EDT ins Spiel.
Konkret:
Ich hab obige Zeile in meiner main(), gleich am Anfang. Danach wird per invokeLater meine GUI gebaut und angezeigt. Wie sich nun herausgestellt hat: Wenn mein Frame angezeigt wird bevor das Ende der main() erreicht wird, dann funktioniert das. Beim Versuch meine App erneut zu starten fliegt die BindException, alles ok.
Wird das Ende der main() aber erreicht und mein Frame wird noch nicht angezeigt, dann wird der Bind zu diesem Zeitpunkt anscheinend aufgelöst, denn dann funktioniert das nicht und ich kann meine App hundertfach starten. Komisch, denn meine App wird ja in so einem Fall trotzdem nicht komplett beendet, der Code den ich per invokeLater auf den EDT lege wird ja immer ausgeführt, und meine App läuft... Ist ja nicht so, dass das Programm terminiert wenn das Ende der main() erreicht wird aber der Code vom invokeLater noch nicht aus der Queue geholt wurde. Das passiert ja immer.
Aber für diese ServerSocket Geschichte macht das scheinbar nen Unterschied. Also... ka woran liegt das nun. Eigenart von ServerSocket? Oder kapier ich hier generell etwas nicht darüber wie/wann eine App eigentlich feststellt ob sie beim Ender der main() terminieren muss oder irgendein Thread vom EDT läuft/gleich laufen wird??