# Timer -> Thread jeden Tag ausführen



## Zender (25. Apr 2009)

Hallo Leute,

ich möchte einen Thread meines Programms jeden Tag um eine bestimmte Uhrzeit starten.
Das Problem ist, dass ich die Laufzeit des Threads im Voraus nicht bestimmen kann, aber unbedingt verhindern will, dass 2 Threads gleichzeitig laufen.

Meine bisherige Suche hat mich auf die java.util.Timer Klasse gebracht.
Dort gibt es die Methode scheduleAtFixedRate, die meine Anforderungen erfüllt, allerdings ein Problem hat:
Kann eine Ausführung nicht planmäßig beginnen, weil noch ein Thread läuft, wird danach versucht dies aufzuholen, was ich nicht möchte:



> In fixed-rate execution, each execution is scheduled relative to the scheduled execution time of the initial execution. If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up." In the long run, the frequency of execution will be exactly the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).


 (Timer (Java 2 Platform SE 5.0))

Habt ihr eine Idee, wie ich mein gewünschtes Verhalten realisieren kann?

Viele Grüße,
Zender


----------



## SlaterB (25. Apr 2009)

die Verzögerung kann doch höchstens paar ms dauern, in dem Bereich ist das vielleicht interessant,
aber doch nicht beim Abstand von Stunden,
es sei denn dein PC ist den ganzen Tag zu 100% ausgelastet, wenn innerhalb von 24 Stunden 10 Aktionen zu je 3 Stunden laufen, dann muss ja alles aus den Fugen geraten 

abgesehen von einem eigenen Thread mit wait(zeit in ms) bleibt dir immernoch zusätzlich die Möglichkeit,
in einer Bearbeitung die aktuelle Zeit abzufragen, zu speichern und mit der Zeit der letzten Ausführung zu vergleichen,
wenn es nicht ein Tag später ist, dann aktuelle Ausführung abbrechen


----------



## Zender (25. Apr 2009)

Ah ok, ich glaube ich habe die Doku falsch verstanden 
Wenn ich sie mir jetzt nochmal angeschaue, lese ich aber nicht heraus, was passiert, wenn eben ein Thread noch läuft während der Scheduler sagt, es soll ein neuer Thread gestartet werden.

Muss ich es selbst implementieren, dass nie 2 Ausführungen gleichzeitig laufen?


----------



## SlaterB (25. Apr 2009)

kann ich nicht sagen, vielleicht durch testen herauszufinden, 

erstelle eine Aktion, die 2 sek dauert, vielleicht durch Thread.sleep() (das meinte ich vorhin, weniger wait())
und schedule sie jede Sekunde und schau dir an was passiert


----------



## tfa (25. Apr 2009)

Vielleicht könnte dir ein Scheduler-Framework helfen, z.B.

https://quartz.dev.java.net/

Damit kann man genau solche Dinge machen, wie du sie planst.


----------



## Ebenius (26. Apr 2009)

Zender hat gesagt.:


> Muss ich es selbst implementieren, dass nie 2 Ausführungen gleichzeitig laufen?


Nein. Ein TimerTask läuft immer nur einmal gleichzeitig. Der nächste Lauf wird frühestens begonnen, wenn der letzte geendet hat.



Zender hat gesagt.:


> [...]was passiert, wenn eben ein Thread noch läuft während der Scheduler sagt, es soll ein neuer Thread gestartet werden.


Bei FixedRate: Die Ausführung wartet bis die derzeitige Ausführung geendet hat. Dann startet die nächste (jetzt natürlich verspätet). Das ganze so oft, bis die Ausführungszeit wieder stimmt.

Beispiel: Ein TimerTask soll (Fixed Rate) alle 10 Sekunden laufen. Der erste Durchlauf dauert eine Minute, jeder folgende 3 Sekunde. Das ganze läuft so ab: 
*0:00* Der erste Durchlauf startet. Durchläufe 2-6 verspäten sich...
*1:00* Durchlauf 2 läuft (0:50 verspätet) Durchlauf 7 verspätet sich...
*1:03* Durchlauf 3 läuft (0:43 verspätet)
*1:06* Durchlauf 4 läuft (0:36 verspätet)
*1:09* Durchlauf 5 läuft (0:29 verspätet)
*1:10* Durchlauf 8 verspätet sich...
*1:12* Durchlauf 6 läuft (0:22 verspätet)
*1:15* Durchlauf 7 läuft (0:15 verspätet)
*1:18* Durchlauf 8 läuft (0:08 verspätet)
*1:20* Durchlauf 9 verspätet sich...
*1:21* Durchlauf 9 läuft
*1:30* Durchlauf 10 läuft
... ab jetzt weiter in sync, alle 10 Sekunden...
Ebenius


----------

