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.
mein Problem ist, dass ich einen Thread eine bestimmte Zeit warten lassen möchte, nur terminiert das Programm an der Stelle, wo ich wait(long wait) aufrufe. Und das ohne Fehlermeldung.
Hier der Code:
Es wartet schon, der Problem ist wohl, dass in beiden Fällen die zeit in Millisekunden angegeben wird und du 100 ms eben schlecht wahrnehmen kannst. Ich nehme mal an, dass es einem erst bei mehr als 2s wirklich auffällt, dass pausiert wird. Probier doch mal folgenden Code für wait aus:
Java:
try {
System.out.println("davor");
System.out.println("Soll:"+wait);
long before=System.nanoTime();
Thread.sleep(wait);
long slept=System.nanoTime()-before;
System.out.println("danach");
System.out.println("Ist:"+slept*1e-6);// Umrechnen von ns in ms
} catch (InterruptedException e) {
System.out.println("bin ich hier?");
}
Theoretisch müsste wait in etwa slept entsprechen (plus minus etwa 10 ms), wenn das nicht der Fall ist, dann hast du ein ernsthaftes Problem mit deiner Java-Installation.
Ich hab das mal in deine Version umgeändert, dies kommt in der Konsole:
Code:
Wurde als denkend initialisiert
davor
Soll:952
Auch wenn ich eine Wartezeit von 4000ms habe ändert sich nichts daran. Es ist wirklich so, als ob das Programm an der Stelle wo ich Thread.sleep() aufrufe, terminiert.
Ist es so als ob es terminiert oder terminiert es wirklich. Also beendet es wirlich oder läuft es ewig weiter ohne eine weitere Ausgabe?
Am sleep kann es nicht liegen, das funktioniert so wie es ist, also muss das Problem irgendwo anders stecken, vielleicht im synchronized (das brauchst du bei sleep nicht). Ich hab keinen blassen Dunst, nach meinem Kenntnisstand gibt es keine Möglichkeit, dass nicht entweder eine Exception oder die Ist ausgabe in der Console kommt. Das einzige was mir einfallen würde ist ein Deadlock, ich kann mir aber nicht vorstellen, wie der während des sleeps zustande kommen soll. Wenn es einer wäre dürfte er nicht auftreten, wenn man das synchronized bei der Methode entfernt.
@Jango: Auch damit funktioniert es nicht, aber in der Funktion wird ja auch wieder dieselbe Thread.sleep() aufgerufen.
@Kevin94: Es terminiert wirklich, deswegen kann es auch nicht in einem Deadlock hängen...es ändert sich auch nichts, wenn ich das synchronized entferne.
Ich habe mir auch Beispiele aus dem Internet angesehen, aber ich kann da wirklich nicht erkennen, woran es bei mir liegen könnte...
Ich nehme mal an, dass es keine weiteren Ausgaben gibt (Exceptions), du nirgendwo System.exit aufrufst und auch nirgendwo Code hast, der Exceptions verschluckt. Wenn all dies zutrifft, bin ich ratlos. Was passiert wenn du das ganze drumherum weglässt und nur in ner Testklasse die wait methode ausführst?
also terminierung durch Thread.sleep() klingt schon ziemlich komisch ... zugegeben ... aber wie die ausgabe zeigt steigt das programm ja nun mal an genau der zeile wirklich aus ...
allerdings würde ich hier eher noch anderen code vermuten der drum herum abläuft aber nicht gepostet wurde ...
ansonsten hat deine java-install , dein os oder möglicherweise sogar deine hardware einen ziemlich heftigen schaden ...
versuche das problem mal auf ein compile-bares minimal-beispiel zu reduzieren ... denn so kann man es leider nicht selbst testen ...
Ich hatte nichts anderes erwartet. Das Problem muss irgenwo im restlichen Code stecken. Hast du bisher immer nur einen Thread gestartet?
Poste doch mal den noch nicht geposteten Code.
dann dürfte außerhalb irgendwas passieren was du nicht gepostet hast ... denn ich vermute der fehler steckt nicht im gepostetem sondern in irgendwas anderem was noch außen drumrum liegt ...
Dann das Sleep iwo einfügen und dann z.B. "sleep(1)" eingeben damit er eine Sekunde "schläft".
Hoffe es kann dir weiterhelfen Auch wenn es sogesehen gelöst ist.
Daran liegt es tatsächlich, was mich allerdings ein kleines bisschen wundert. In meinem kleinen Testprogramm oben lief es sowohl in der main()-Methode als auch unter Junit, deswegen hatte ich ausgeschlossen, dass es etwas damit zu tun haben kann.
Danke nochmal, jetzt kann ich endlich mit der eigentlichen Aufgabe anfangen