Problem war, dass mein Spiel nicht ausgeführt wurde (die schleife nicht lief). Erst nachdem ich zwischen while(!terminated) und if(running) noch einen Befehl (System.out.println()) eingefügt hatte ging es. Aber woran es lag konnte ich nicht sagen.
Das selbe Problem tritt momentan noch auf wenn ich das if in ein while ändere.
Wird da irgendwie was zu schnell abgetestet? so wirklich verstehe ich das Problem nicht.
while(!terminated) läuft ja ständig und bei jeden Durchlauf testet er ja ab ob running == true ist.
Der Button setzt running wirklich auf true aber der GameLoop reagiert dann halt aus irgendeinen Grund nicht drauf obwohl er nach meinen Verständlich permanent testen müsste ob running auf true ist und bei einer Änderung auch reagieren müsste.
Problem war, dass mein Spiel nicht ausgeführt wurde (die schleife nicht lief). Erst nachdem ich zwischen while(!terminated) und if(running) noch einen Befehl (System.out.println()) eingefügt hatte ging es.
Hast du den irgend eine Art von Ausgabe, ohne den Syso-Befeh zwischen der While-Schleife und if-Abfrage?
Ansonsten läuft dein Programm schon richtig.
Nur siehst du nichts, da keine Ausgabe gemacht wird.
Der GameLoop ist genau so wie im Spiel. Zwischen While-Schleife und if-Abfragesteht nix.
Hier muss ich mich mal korrigieren mit while und if geht es. Nur wenn ich das if in ein while ändere geht es nicht mehr.
Also Deadblocks sind quasi Zustände in dem zwei Threads (in meinen Fall der Spiel-Thread und der MainThread) die gleiche Ressourche irgendwie beanspruchen.
Also könnte man eventuell mal probieren das running zu synchronisieren?
Wenn bei dem "sleep" eine 0 übergeben wird, macht er gar nichts, und es kann sein, dass dieser Thread dann alleine läuft (SEHR vereinfacht). Mach' mal sowas wie
Das Problem dürfte sein das in der while ein sleep fehlt.
Vereinfacht : wenn isTerminated false ist und gleichzeitig runnig ebenfalls false ist dann hast du eine leere Endloseschleife. Und die frisst extrem viel CPU-Zeit wesshalb es dazu kommen kann das der Loop viel zu ausgelastet ist mit nichts-tun um auf die Flagänderung zu reagieren. Leere loops sollte man grundsätzlich vermeiden und stattdessen gerade bei solchen "Pausen" mit wait und notify arbeiten.
btw : while(!bool) macht man nicht (lange Form : ist es wahr das etwas falsch ist). Wenn man dierekt nur bools hat dann schreibt man immer so das man dierekt auf den bool prüft.
Also statt while(!isTerminated) halt auf while(isNotTerminated).