Warum muss man manchmal in der RUnmethode sleep in eine schleife tun?

berserkerdq2

Bekanntes Mitglied
Des Öfteren habe ich gesehen, dass bei manchen Musterlösungen, wenn da stand stoppe den Thread jede Sekunde, man sowas gemacht hat, in der Runmethode:

Wiki:
while(true){
    try{
       sleep(1000);
     }catch{...}
    //Und folgend heir alles drinne, was die Runmethode ausführen soll
}

Also in einer whileschleife, die unendlich oft ausgeführt wird.
Andernfalls habe ich auch das gesehen:

Code:
//Befehel die ausgeführt werden sollen

try{
    sleep(1000);
}catch{...}
 (Ohne whileschleife, nur im try catch block)

Wann nutze ich was?
 
Beste Antwort
Erster ist ein Interval, zweiteres einfach eine Dauer. Das ist mehr eine Frage der Formulierung als zu Java.

50x pro Sekunde definiert ja nicht wie lange => unendlich
10 Sekunden pausieren ist eine klare Angabe => nicht unendlich
Das macht man einfach nur um zu verdeutlichen, dass es sich um einen Methodenaufruf handelt, welcher viel Zeit benötigt. Gleichzeitig hat es den Vorteil, dass der Thread schlafen geschickt wird und andere Programmteile ungestört aktiv werden können. So kann man einfach gut demonstrieren wie man mit Threads arbeiten kann.
 
Das macht man einfach nur um zu verdeutlichen, dass es sich um einen Methodenaufruf handelt, welcher viel Zeit benötigt. Gleichzeitig hat es den Vorteil, dass der Thread schlafen geschickt wird und andere Programmteile ungestört aktiv werden können. So kann man einfach gut demonstrieren wie man mit Threads arbeiten kann.
Aso, also ist es egal, was ich nutze? Weil manchmal ist es bei mir der Fall gewesen, wenn ich die Schleife entfernt habe, dass das Programm nicht mehr richtig funktioniert hat.
 
Na mit einer endlos Schleife läuft der Thread hallt endlos.
Alles was in der while ist wird immer wider ausgeführt.

Ohne wird der Code vor und hinter dem sleep nur einmal aufgeführt.
Bei einer Aufgabenstellung stand, der Thread soll 50x pro Sekunde pausieren, da war es in einer while, bei einer anderen stand pausiere den Thread um 10 sekunden. Musste man an dem pro Sekunde erkennen, dass es unendlich sein muss? Kann man das als Indikator nehmen?
 
Erster ist ein Interval, zweiteres einfach eine Dauer. Das ist mehr eine Frage der Formulierung als zu Java.

50x pro Sekunde definiert ja nicht wie lange => unendlich
10 Sekunden pausieren ist eine klare Angabe => nicht unendlich
 
Beste Antwort
Bei einer Aufgabenstellung stand, der Thread soll 50x pro Sekunde pausieren, da war es in einer while, bei einer anderen stand pausiere den Thread um 10 sekunden. Musste man an dem pro Sekunde erkennen, dass es unendlich sein muss? Kann man das als Indikator nehmen?
Na, ein
Java:
while(true){ }
führt das, was innendrin steht, immer wieder aus, bis in alle Ewigkeit.
Endlosschleife schlicht und ergreifend.

Dein "50 mal pro Sekunde" heißt ja umgekehrt, dass ein bestimmter Code alle 60/50=1.2 Sekunden ausgeführt.
Also grob gesprochen der Codeblock ausgeführt wird, dann 1.2 sekunden gewartet wird, codeblock ausführen, 1.2 sekunden warten,
immer im Wechsel, bis in alle Ewigkeiten.
Da schreibt man dann sowas wie

Java:
while(true){
  Thread.sleep();
  //Code zum Ausführen

}

Das Andere ist halt, wnen du einmalig 10 Sekunden wartest oder so.
 
Ein Endlos Thread mit Sleep ist für eine exakte regelmäßige Ausführung übrigens nicht geeignet, er berücksichtigt nicht, wie lange die Code-Ausführung dauert.

Wenn du wirklich exakt alle x Sekunden was machen willst, verwende einen Timer, der gleicht das aus. Natürlich kann der auch keine Wunder wirken, wenn z.B. die Ausführungsdauer zu lang ist für die gewünschte Frequenz.
 
Ein Endlos Thread mit Sleep ist für eine exakte regelmäßige Ausführung übrigens nicht geeignet, er berücksichtigt nicht, wie lange die Code-Ausführung dauert.

Wenn du wirklich exakt alle x Sekunden was machen willst, verwende einen Timer, der gleicht das aus. Natürlich kann der auch keine Wunder wirken, wenn z.B. die Ausführungsdauer zu lang ist für die gewünschte Frequenz.
Das sind dann natürlich Fragen der genauen Aufgabenstellung, ob der 1 Sekunden Timer mit Beginn der Codeausführung zu laufen beginnen soll.
Oder die 1 Sekunde erst losgehen soll wenn der Code erfolgreich ausgeführt wurde.
 

Zurück
Oben