Resourcen schonnendes Zeitabfragen

Mikrowelle

Bekanntes Mitglied
Hallo

In einer Art Simualtion wo das Jahr bei 1 beginnt, habe ich eine Klasse geschrieben die jede Minute den Monat um 1 Erhöht.

Das ganze fängt mit System.currentTimeMillis() in einer while(true) schleife an. Wo die ganze Zeit geschaut wird ob 1 min vergangen ist.

Das Problem ist das es sehr viel CPU verbraucht da der Thread nie beendet wird und diese Schleife permanent läuft.

Ich habe leide keine Idee gerade wie ich das anders bauen kann.

Nochmal verständlich, ich will das jede Minute eine variable x++; gerechnet wird. Wie kann ich das am besten lösen?

Danke
 
N

nillehammer

Gast
Nochmal verständlich, ich will das jede Minute eine variable x++; gerechnet wird. Wie kann ich das am besten lösen?
Durch einen Aufruf von Thread.sleep(..) legst Du den Thread für die gewünschte Zeitspanne (60000 ms) schlafen. Das sollte die CPU-Last deutlich reduzieren.
 

faetzminator

Gesperrter Benutzer
Du kannst einen Timer verwenden. Aber um den Prozessor zu entlasten, genügt ein einfaches [c]Thread.yield()[/c] (am Ende innerhalb der Schleife), das gönnt dem Thread eine Verschnaufspause.

Edit: ein [c]Thread.sleep()[/c] ist in meinen Augen nicht zu empfehlen.
 
Zuletzt bearbeitet:
A

asdasdasdasd

Gast
Ich würde Thread.sleep() empfehlen. Da Thread.yield() wirkungslos ist, wenn kein anderer Prozess mit gleicher Priorität die CPU benötigt.

Gruß
 
N

nillehammer

Gast
faetzminator hat gesagt.:
Edit: ein Thread.sleep() ist in meinen Augen nicht zu empfehlen.
@faetzminator: Warum nicht? Abgesehen davon, dass man sich nicht 100% darauf verlassen kann, dass der Thread wirklich nach der gewünschten Zeitspanne aufwacht und nicht evtl. etwas später, ist es doch genau dafür gemacht oder nicht? Oder weiß ich etwas Wichtiges über Thread.sleep evtl noch nicht?
 

faetzminator

Gesperrter Benutzer
@faetzminator: Warum nicht?

Weil es - wie gesagt - dafür den Timer gibt.
Abgesehen davon, dass man sich nicht 100% darauf verlassen kann, dass der Thread wirklich nach der gewünschten Zeitspanne aufwacht und nicht evtl. etwas später, ist es doch genau dafür gemacht oder nicht?

Hab mir den Code von Timer nie angeschaut, aber das wird wohl auch auf ihn zutreffen.

Und eben, im Fall von CPU-Auslastung wegen "schweren" Berechnungen, da verwendet man sowieso nie [c]sleep()[/c], sondern ggf. [c]yield()[/c].
 

truesoul

Top Contributor
@faetzminator: Warum nicht? Abgesehen davon, dass man sich nicht 100% darauf verlassen kann, dass der Thread wirklich nach der gewünschten Zeitspanne aufwacht und nicht evtl. etwas später, ist es doch genau dafür gemacht oder nicht? Oder weiß ich etwas Wichtiges über Thread.sleep evtl noch nicht?

Hallo nillehammer.

Weil während des Schlafen von
Java:
sleep()
der Thread die Ressourcen weiter behält und dadurch kann er auch andere Threads Bremsen.
Und
Java:
yield()
geht freiwillig in den Ruhezustand und gibt anderen Threads die Chance was zu machen. Vorausgesetzt, die Threads haben die gleiche Priorität.

Und ich würde auch Timer verwenden!
Gruß
 
Zuletzt bearbeitet:

xehpuk

Top Contributor
Code:
Thread.yield()
ist "rarely appropriate to use" (siehe Javadoc). Auch nicht in diesem Fall.
Ein schlafender Thread bremst keine anderen, solange nicht alle an die von ihm gehaltenen Locks wollen. Von daher ist
Code:
Thread.sleep(long)
schon zu empfehlen, nur ist ein Timer hier einfach die elegantere Lösung.
 

Ähnliche Java Themen

Neue Themen


Oben