Thread.sleep() problem

Status
Nicht offen für weitere Antworten.
M

MarlonD

Gast
Hallo!

Bei der Umsetzung eines Echtzeit-Browsergames (Applet) mache ich die negative Entdeckung, dass das gleiche Programm mit gleichen Parametern, Konstanten, etc... ab und zu ein wenig anders läuft. Diese Asynchronität rührt aber nicht von einer unterschiedlichen Java-Version oder Rechnersystems.
Ich habe einiges getestet und wie es ausschaut führt kein Fehler zu dem Problem. (Dieser könnte ja die laufende Schleife abbrechen und weitere Programmteile ignorieren...)

Daher glaube ich, dass es am Thread liegt.
Für das Programm verwende ich allerdings bloss einen Thread, der für die gesamte Logik verantwortlich ist.
Ich bin jetzt kein Guru was Threads anbelangt, aber trotzdem bin ich mir relativ sicher, dass sich ein und der selbe Thread nicht "selber überspringen" kann.
Oder täusche ich mich da? Ist es evtl. möglich, dass nach Ablauf der Zeit in "Thread.sleep(zeit)" der Thread erneut gestartet wird, oder läuft der Thread wie erwartet zu Ende?

Ich gehe jetzt mal davon aus, dass der Thread zusätzlich zur Ausführzeit die Zeit "zeit" wartet.
Wer kann mich aufklären/mir helfen?

Danke im Vorraus!
Marlon
 

madboy

Top Contributor
Thread.sleep() legt den Thread schlafen und so bald die Zeit abgelaufen ist, gehts im Programmfluß hinter Thread.sleep() weiter.

Wenn du schreibst "ab und zu ein wenig anders läuft", sieht das für mich nach einem Synchronisationsproblem zwischen verschiedenen Threads aus. Aber ohne weitere Informationen lässt sich nicht viel sagen.

Beschreibe doch bitte, was genau du haben willst und was genau passiert. Am besten mit einem minimalen, lauffähigen Beispiel, das das Problem demonstriert.
 

Marco13

Top Contributor
....bin ich mir relativ sicher, dass sich ein und der selbe Thread nicht "selber überspringen" kann.
Wenn du sagst, was das heißt, kann jemand das bestätigen oder verneinen.

Ist es evtl. möglich, dass nach Ablauf der Zeit in "Thread.sleep(zeit)" der Thread erneut gestartet wird, oder läuft der Thread wie erwartet zu Ende?
Der Thread wird von außen gestartet, wartet gegebenenfalls, wird bestenfalls von außen unterbrochen (und läuft andernfalls zuende), und kann auch nur von außen neu gestartet werden.

Ich gehe jetzt mal davon aus, dass der Thread zusätzlich zur Ausführzeit die Zeit "zeit" wartet.
Prinzipiell ja...
 
M

MarlonD

Gast
Erstmal Danke für die Antworten!

Ich habe momentan keinen Zugriff zum Code, ein Posting dessen wäre wahrscheinlich sowieso viel zu verwirrend.
Ich könnte es aber mal kurz beschreiben:

Es gibt bei der Anwendung lediglich einen PaintThread (der ist fürs Zeichnen der Bilder im Applet zuständig), einen ImageLoadThread (der lädt die Bilder, die fürs Zeichnen benötigt werden) und einen LogicThread (der ist für jegliche Rechenoperationen zuständig, die den Spielablauf bestimmen).
Folglich kann logischerweise auch nur der zuletzt genannte Thread für die Asynchronität verantwortlich sein.

Der LogicThread durchläuft eine Schleife und wartet anschliessend 10 ms. Dies passiert solange, bis das Spiel vorbei ist.
Bei jedem Eintritt in diese Schleife wird eine Zählervariable um 1 inkrementiert. Diese steht also für den Zyklus, in dem sich das Programm aktuell befindet. Danach wird die gesamte Spiellogik für einen Durchlauf berechnet.

Im normalen Singleplayer Modus funktioniert das Spiel auch sehr gut und macht Spass. Im sich in der Produktion befindlichen Multiplayer Modus jedoch gibt es ab und zu diese angesprochene Problematik mit der Asynchronität.

Ich gebe in der Konsole aus, in welcher Runde was passiert und mache die Beobachtung, dass der Zyklus zwischen beiden Spielern manchmal leicht voneinander differenziert, was natürlich eine Lawine der Asynchronität hervorruft.
Hinzuzufügen wäre noch, dass ich hier von einem Rundenbasierten Modus spreche. Also wie bereits besprochen wird das gesamte Programm mit den absolut gleichen Parametern und Objekten für Spieler1 und Spieler2 ausgeführt.

Alle Fehler, die ich auffange, gebe ich in der Konsole aus, jedoch tritt keiner auf. Ich kann mir jedoch nicht vorstellen, warum der Zyklus teilweise schneller voran gezählt wird.
Deswegen meine Überlegung, dass sich der Thread "überspringt", also das quasi die Schleife vor Ablauf der Vorigen gestartet wird. Aber das kann doch eigentlich nicht sein?!?

Wo ist dann der Denkfehler? Ich persönlich tippe auf 99%, dass es was mit der Threadprogrammierung zu tun hat.

Mhhh, soweit erstmal dazu, evtl. weiss jemand weiter...

Marlon
 

EgonOlsen

Bekanntes Mitglied
Und die Spieler werden einer nach dem anderen in selben Thread bearbeitet? Oder sind das zwei getrennte?
 

madboy

Top Contributor
Habe ich das richtig verstanden, dass wenn bei einem Spieler 9,5 ms gewartet wird und beim anderen 10,5 ms, dass dann die von dir beschriebenen Probleme auftreten können?

Falls ja: Thread.sleep() ist kein Präzisionsinstrument in dem Sinne. Das Problem ist allerdings nicht unbedingt die Java-Methode, sondern das Prinzip, nach dem (nicht realtime-)Betriebssysteme die CPU zuteilen (Stichwort scheduling). Es kann und wird durchaus vorkommen, dass nicht exakt die Zeit geschlafen wird, die bei Thread.sleep() angegeben wird.

Falls nein: ich verstehe immer noch nicht, was das Problem ist.
 
M

MarlonD

Gast
Es ist irrelevant wie lange gewartet wird.
Du könntest das Spiel auf einem 486 zocken und es sollte funktionieren. Es ist mir auch klar, das besonders Windows es nicht so genau nimmt mit der Systemzeit.

Es ist eine Art Challenge (Herausforderung) die ausgetragen wird.
Du forderst einen Spieler heraus, indem du deine Objekte (Türme) setzt. Dieser kann dann die Herausforderung annehmen und kontern. Hat auch er all seine Objekte platziert geht das Spiel los.
Ab jetzt ist es wie ein Film, alles wird berechnet, sollte aber immer gleich berechnet werden.
Der Herausforderer kann sich im nachhinein das ganze (den Film) nochmal ansehen.
In den meisten Fällen ist es (wir hatten 50000 Zyklen) sogar zu 100 % synchron. Aber eben nicht immer. Meistens tritt sofort am Anfang eine Asynchronität auf.

Achja, für alle Interessenten (Bilder sagen mehr als 1000 Worte):
www.towerwars.de
 

EgonOlsen

Bekanntes Mitglied
Also d.h. das läuft dann auf zwei Clients, wenn ich das richtig verstehe? Und es ist völlig Tüte, ob nun wirklich 10ms oder 20ms oder auch 10h gewartet wird, es muss nur nach 10000 Schritten der Stand der Spielwelt identisch sein...und das ist er nicht. Richtig verstanden soweit? Wenn ja, dann, da sich Treads nicht "selber überholen" können, musst du irgendein nicht-deterministisches Element haben. Machst du vielleicht implizit noch irgendwas am Stand der Welt im AWT Eventthread?
Wie genau äußert sich denn das Asynchrone?
 
M

MarlonD

Gast
Ja genau!
Du hast es richtig verstanden.

Aber einen AWT Eventthread habe ich nicht, oder doch?
Ich zeichne nunmal innerhalb der paint Methode, und dieses Zeichnen ist ja losgelöst vom LogicThread.
Oder meinst du die Eventlistener wie Keylistener oder Mouselistener? Nunja, das alles sollte eigentlich keine Rolle spielen.

Also wie gesagt tritt meistens am Start eine Asynchronität auf.
Ein Beispiel:
Der Pfeil des gleichen Turmes trifft bei Spieler1 7 Zyklen früher ein als bei Spieler 2.
Meistens verhällt es sich aber das ganze Spiel über (~40000 Zyklen) synchron.
Tritt aber die Asynchronität auf (was etwa bei jedem 4. Mal und dann meistens am Anfang der Fall ist) läuft das gesamte Spiel aus dem Rahmen.
Ich kann es mir nicht erklären, es werden zwar Bilder geladen am Anfang, dann aber in einem anderen Thread.

Es ist wirklich zum Verzweifeln... Nunja werde weiter testen.
Wenn einem nochwas einfällt, ich bin wirklich für alles dankbar.
Gute Nacht!
Marlon
 

EgonOlsen

Bekanntes Mitglied
MarlonD hat gesagt.:
Aber einen AWT Eventthread habe ich nicht, oder doch?
Ich zeichne nunmal innerhalb der paint Methode, und dieses Zeichnen ist ja losgelöst vom LogicThread.
Oder meinst du die Eventlistener wie Keylistener oder Mouselistener? Nunja, das alles sollte eigentlich keine Rolle spielen.
Beides. Zeichnen und die Listener läuft in einem Thread, eben diesem AWT Eventthread. Ich dachte, du machst da vielleicht implizit irgendwas, was sich mit dem Logikthread beisst, wie z.B. Position des Pfeils lesen, zeichnen und Position dann wieder setzen (warum auch immer...aus versehen vielleicht)...sowas in der Art. Das würde erklären können, wieso es manchmal nicht stimmt, weil Teile der Spielwelt "von hinten" modifiziert werden.
 
M

MarlonD

Gast
Nein, also sowas mache ich definitiv nicht.
Ich weiss, es ist zum Haare raufen und ich werde das wohl akribisch debuggen muessen.
Danke auf jedenfall bis hierhin und wem nochwas einfaellt, der kann ja gerne schreiben.

Ansonsten: www.towerwars.de (Wenigstens funktioniert der Singleplayer)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Problem mit Thread.sleep() Spiele- und Multimedia-Programmierung 7
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
0 Workaround für Thread.sleep()-Bug Spiele- und Multimedia-Programmierung 15
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
O Thread pausieren und wieder starten Spiele- und Multimedia-Programmierung 2
kaoZ Animation in eigenen Thread auslagern..... Spiele- und Multimedia-Programmierung 1
gamebreiti Daemon Thread Spiele- und Multimedia-Programmierung 4
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
O Universe <- show Thread Spiele- und Multimedia-Programmierung 14
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
G Thread startet nicht im Vollbild modus Spiele- und Multimedia-Programmierung 3
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
M Roundbased - Thread anhalten Spiele- und Multimedia-Programmierung 8
D Wasserstrahl animieren: ein Thread je Tropfen? Spiele- und Multimedia-Programmierung 7
S Thread unterbrechen Spiele- und Multimedia-Programmierung 3
A Gibt es den nichts besseres als sleep() ? Spiele- und Multimedia-Programmierung 18
A [HILFE] - Minecraft-Problem! Spiele- und Multimedia-Programmierung 1
C Plugin Problem Spiele- und Multimedia-Programmierung 2
J JLayer Problem Spiele- und Multimedia-Programmierung 1
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G LIBGDX Texturen Problem Spiele- und Multimedia-Programmierung 1
G LIBGDX Problem beim resizen des Frames Spiele- und Multimedia-Programmierung 3
C AutoClicker Problem Spiele- und Multimedia-Programmierung 2
S OOP Logik Problem Spiele- und Multimedia-Programmierung 5
G LIBGDX Viewport Problem Spiele- und Multimedia-Programmierung 3
J Problem mit Game Of Life Spiele- und Multimedia-Programmierung 3
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
C Minecraft Minecraft Plugin Problem Spiele- und Multimedia-Programmierung 17
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
V Problem mit BufferStrategy Spiele- und Multimedia-Programmierung 2
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
W Generelles Problem: Entscheidungsfindung Spiele- und Multimedia-Programmierung 4
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
C Vier Gewinnt Problem mit Ordnerstruktur Spiele- und Multimedia-Programmierung 2
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Sound Problem Spiele- und Multimedia-Programmierung 3
T Problem beim Aufbau des Spielfelds Spiele- und Multimedia-Programmierung 18
M Sound Engin Problem 2 Spiele- und Multimedia-Programmierung 2
J Problem bei der GUI - Zu viele Spielbretter Spiele- und Multimedia-Programmierung 2
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
C Zeldaklon Problem mit Wand-Kollision Spiele- und Multimedia-Programmierung 8
0 Boxen übereinander stapelt Problem Spiele- und Multimedia-Programmierung 5
D Textfield im Game ,Problem: while-Schleife Spiele- und Multimedia-Programmierung 3
R 2D platformer - enemy damage -> TIMER PROBLEM Spiele- und Multimedia-Programmierung 3
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
L Minecraft Minecraft Plugin programmieren (Craftbukkit 1.7.2) Problem Spiele- und Multimedia-Programmierung 4
B Minecraft mehr Ram zuweißen Problem Spiele- und Multimedia-Programmierung 0
K Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 3
Y Problem mit repaint() in run() Spiele- und Multimedia-Programmierung 2
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
J Minecraft Problem mit dem JRE - Minecraft Spiele- und Multimedia-Programmierung 3
TheSorm Problem mit 2 classen NullPointerException Spiele- und Multimedia-Programmierung 1
S Problem mit 4 gewinnt(MinMax Algorithmus) Spiele- und Multimedia-Programmierung 2
N Problem in der Main.class Spiele- und Multimedia-Programmierung 1
J Blöcke, Hitboxen, Koolisionsabfrage - Problem Spiele- und Multimedia-Programmierung 8
S Problem mit 3d-Polygon Spiele- und Multimedia-Programmierung 2
A Problem mit Sound Spiele- und Multimedia-Programmierung 5
C Nxt Duell Problem Spiele- und Multimedia-Programmierung 4
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
ruerob Problem bei Fade-Out von Sounds Spiele- und Multimedia-Programmierung 3
L [Slick2D] Problem bei Speicherfreigabe Spiele- und Multimedia-Programmierung 2
M Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 22
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
F Problem mit dem Abspielen von byte[] (Audioprogrammierung) Spiele- und Multimedia-Programmierung 2
C Problem mit Abspielen von Audio-Dateien Spiele- und Multimedia-Programmierung 3
R Problem bei Farbe ändern/4Gewinnt Spiele- und Multimedia-Programmierung 5
R StringIndexOutOfBoundsException - Problem Spiele- und Multimedia-Programmierung 2
S Problem mit Sichtfeld/Licht in einem Raster Spiele- und Multimedia-Programmierung 5
G Acht-Damen-Problem HILFE! Spiele- und Multimedia-Programmierung 11
A TileMap KeyListener - Problem Spiele- und Multimedia-Programmierung 2
J Problem mit Threads Spiele- und Multimedia-Programmierung 8
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
S Problem mit Zeitsteuerung der Game Loop Spiele- und Multimedia-Programmierung 4
Fu3L Problem mit 3D Noise Spiele- und Multimedia-Programmierung 4
L Problem beim Rätsellöser Spiele- und Multimedia-Programmierung 3
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
T Problem mit ClassLoader und LWJGL Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen

Neue Themen


Oben