Methoden Main-Methode verhält sich in .jar anders als in Eclipse

Hallo zusammen,

ich bin mir nicht ganz sicher, in welchem bereich die Frage am Besten aufgehoben ist, darum stelle ich sie jetzt einfach mal in das Grundlagen-Subboard, nachdem mir die Frage doch recht dämlich vorkommt.

Ausgangssituation: Beim starten des Programs wird ein Launcher gestartet, der eine GUI mit einem "Start"-Button beinhaltet. Beim drücken dieses Buttons wird im Launcher eine Flag (isReadyToLaunch) auf true gesetzt.

Das Prog soll auf das drücken des Buttons warten, dann eine Spiele-Session starten und nach dem Beenden der Session die Flag zurück auf "false" setzen und wieder warten.
Die von mir formulierte Main-Methode befindet sich ebenfalls in der Launcher-Klasse:

Java:
public static void main (String [] args) throws InterruptedException{

		Launcher launcher = new Launcher( );
		launcher.startLaunchScreen();
			
				
		while ( true ){						
			if (launcher.isReadyToLaunch == true){
				launcher.launchGame();
				launcher.isReadyToLaunch = false;					
				launcher.startLaunchScreen();
				}
			}
	
	}

Mit Eclipse gestartet funktioniert das alles ohne Probleme. Exportiere ich es jedoch als runnable .jar, löst das Drücken des Buttons nichts aus, unabhängig ob über Kommandozeile oder per Doppelklick gestartet. Füge ich aber ausserhalb des if's in der while-schleife eine sysout-ausgabe, ein thread.sleep oder sonst etwas ein, funktioniert es ohne Probleme. Also bleiben mir eigentlich nur 2 Fragen, bei denen ich auf Eure hilfe hoffe:

1. Warum? (Präziser: An welcher Mechanik welches Systems liegt das. Ich habe ein paar Theorien, aber eine fachlich korrekte Antwort wäre mir wichtig)

2. Wie formuliere ich so etwas auf eine korrekte/saubere Weise, um derartigen Problemen zukünftig aus dem Weg zu gehen?


Schönen Sonntag Euch noch,
RS

ps. Nein, ich hatte nicht vor, in der fertigen Version die Interrupted-Exception in der Main zu werfen 😉
 
Zuletzt bearbeitet:
das problem ist dein loop selbst ...

while(true) { }

ist ein leerer endlos loop der eine riesige CPU-last erzeugt ... da ständig immer nur genau ein und der selbe JMP ausgeführt wird ...

daraus folgt : dein loop bekommt es überhaupt nicht mit das das flag geändert wurde ...
grundsätzlich sollte in solche loops mindest ein Thread.sleep() von 10ms oder mehr eingebaut werden um 1) noch änderungen von außen mit zu bekommen und 2) den CPU nicht 100% auszulasten ...

warum das ganze in eclipse richtig läuft versteh ich nicht ... kann mir aber vorstellen das dort interne "bremsen" greifen ...


aber zum eigentlichen : SO sollte man sowas eh nicht machen ... ein endlos-loop der auf n flag wartet ... nein nein ... hier lieber von innerhalb des listeners in nem extra thread das eigentliche programm anstoßen ...
 
das problem ist dein loop selbst ...

while(true) { }

ist ein leerer endlos loop der eine riesige CPU-last erzeugt ... da ständig immer nur genau ein und der selbe JMP ausgeführt wird ...

daraus folgt : dein loop bekommt es überhaupt nicht mit das das flag geändert wurde ...
grundsätzlich sollte in solche loops mindest ein Thread.sleep() von 10ms oder mehr eingebaut werden um 1) noch änderungen von außen mit zu bekommen und 2) den CPU nicht 100% auszulasten ...

Danke, etwas genau in diese Richtung hatte ich mir gedacht.

aber zum eigentlichen : SO sollte man sowas eh nicht machen ... ein endlos-loop der auf n flag wartet ... nein nein ... hier lieber von innerhalb des listeners in nem extra thread das eigentliche programm anstoßen ...

Da bin ich schon dabei 😉

Thema erledigt, danke für die schnelle Hilfe 🙂
 

Zurück
Oben