Frage von Felix193, 73

[Java] Warum wird der Thread nicht angehalten(Thread.sleep())?

Hallo,

ich arbeite im Moment an einem Minecraft Plugin, das alle 10 Sekunden die Daten aus mehreren Textdatein lesen soll. Das ist das erstemal, dass ich mit Threads in Java arbeite und leider klappt's noch nicht so ganz. Es gibt keinen Error in der Konsole, daher habe ich einfach Ausgaben gemacht, die mir verraten, was nicht funktioniert. Hier ist der Code der Klasse, die in einem neuen Thread gestartet wird: http://pastebin.com/Kxz7mSUG

Den Thread starte ich in einer anderen Klasse wie folgt:

    Thread t = new Thread(new LobbySwitcherThread());
            System.out.println("Ich funktioniere!");
            t.start();

Der Thread wird auch vernünftig gestartet, nur wird über 30-50 mal die Sekunde in der Konsole "Schleife in Thread läuft..." gespammt - dementsprechend wird das "Thread.sleep(10000);" ignoriert. Was habe ich falsch gemacht? Bestimmt habe ich wieder einen dummen Fehler gemacht... Ich denke mal, dass es vom einen zum anderen kommt. Ich denke nicht, dass Java wirklich mehrere Textdatein 30-50 mal in der Sekunde lesen kann...

Wenn ihr eine Verbesserung vorschlägt, wäre ich sehr dankbar, wenn ihr noch kurz eine Erklärung dazu schreibt. Mich interessiert, was ich falsch gemacht habe und will daraus lernen.

Vielen Dank!

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von androhecker, 54

Ohne das ganze überhaupt gelesen zu haben, kann ich sagen, dass Thread.sleep() hier der komplett falsche Ansatz ist.

Es gibt zwei Möglichkeiten:

1. Mit Java Timern, dort kannst du einen TimeTask (wie Runnable) erzeugen der mit einem bestimmten delay periodisch ausgeführt wird. Das ist die korrekte Methode für Java etwas alle 10 Sekunden auszuführen.

2. Mit dem Bukkit Scheduler, das ist wie der Name schon sagt ist das eine Art Timer für Bukkit. Diese Methode wäre in dem Fall auch die beste.

Anleitungen kannst du im Internet genug finden.

Kommentar von Felix193 ,

Vielen Dank für deine Antwort. Dann muss ich wohl das Buch wechseln oder nochmal genauer nachlesen. Wahrscheinlich habe ich mich nur verlesen...

Kommentar von androhecker ,

Welches Buch benutzt du denn?

Eigentlich verwendet man Thread.sleep() möglichst gar nicht, vor allem auch weil die genaue Zeit nicht gewährleistet werden kann und weil es nur den Betrag zur Ausführzeit hinzufügt. D. h. wenn dein Code 5 Sekunden braucht ist die Periodenzeit 15 Sekunden und nicht 10, bei einem Timer ist die Ausführzeit irrelevant.

Kommentar von Felix193 ,

"Programmieren lernen mit Java" naja. Kannst du mir ein gutes empfehlen? Ich habe jetzt mal das mit dem Bukkit Scheduler recherchiert und es funktioniert so wie ich es will.

Nur klappt's nicht ganz mit den Variablen. Ich habe das ganze, wie im Buch erklärt, mit diesen get- und setmethoden umgesetzt. Ich habe mir ausgeben lassen, wo die Variablen nicht über geben werden. Ich bekomme schon die Variable nicht mehr aus dem Try-Block. Was habe ich dort falsch gemacht? Kennst du eigentlich in die Richtung Variablen und besonders die Nutzung in mehreren Klassen auch noch ein gutes Tutorial? Vielen Dank für deine Tipps!

Kommentar von androhecker ,

Also eigentlich sind Rheinwerk Bücher gut, wobei es auch sein kann, dass die eine Bewertung damit recht hatte, dass die Qualität später nachlässt. Wenn du bereits vieles in Java kannst (davon gehe ich aus, wenn du mit Threads arbeitest) dann kannst du was mit Java ist auch eine Insel anfangen, das Buch ist wirklich sehr gut. (Aber eben nicht für Anfänger) Wäre gut wenn du noch mal den Code schicken würdest, ich kann dir auch auf Skype helfen wenn du willst, Name ist dav200111

Kommentar von Felix193 ,

habe dir jetzt mal eine Anfrage gestellt.

Expertenantwort
von KnusperPudding, Community-Experte für Java, 27

Du hast zwei Try-Catch-Blöcke, die jeweils unterschiedliche Ereignisse Abfangen.

Der innere Block, den du mit IOException abfängst löst bereits bevor es zum Thread.sleep() kommt einen Fehler aus, wodurch dein Thread.sleep() nie ausgeführt wird.

Antwort
von Mikkey, 30

In der Schleife tritt eine Ausnahme auf, die Du wegen

catch(IOException e){

 }

nicht siehst.

Antwort
von Atomtoasty, 18

Mach es doch mit einer BukkitScheduler das ist sehr viel einfacher

Keine passende Antwort gefunden?

Fragen Sie die Community