2009-09-21 19 views
95

Ich fand ähnliche Fragen hier, aber es gab keine Antworten zu meiner Zufriedenheit. Also die Frage noch einmal umformulieren -Timer & TimerTask versus Thread + Schlaf in Java

Ich habe eine Aufgabe, die auf einer periodischen Basis (sagen wir 1 Minute Intervalle) getan werden muss. Was ist der Vorteil der Verwendung von Timertask & Timer, um dies zu tun, im Gegensatz zum Erstellen eines neuen Threads, der eine Endlosschleife mit Schlaf hat?

Code-Snippet mit timertask-

TimerTask uploadCheckerTimerTask = new TimerTask(){ 

public void run() { 
    NewUploadServer.getInstance().checkAndUploadFiles(); 
} 
}; 

Timer uploadCheckerTimer = new Timer(true); 
uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000); 

Code-Schnipsel mit Gewinde und Sleep-

Thread t = new Thread(){ 
public void run() { 
    while(true) { 
    NewUploadServer.getInstance().checkAndUploadFiles(); 
    Thread.sleep(60 * 1000); 
    } 
} 
}; 
t.start(); 

ich habe nicht zu kümmern, wenn ich bestimmte Zyklen wirklich vermissen, wenn die Ausführung der Logik nimmt mehr als die Intervallzeit.

Kommentar Bitte auf diese ..

Danke,
-Keshav

Update:
Vor kurzem fand ich einen weiteren Unterschied zwischen Timer gegen Thread.sleep() verwenden. Angenommen, die aktuelle Systemzeit ist 11:00 Uhr. Wenn wir die Systemzeit aus irgendeinem Grund auf 10:00 Uhr zurücksetzen, wird der Timer die Ausführung des Tasks stoppen, bis er 11:00 Uhr erreicht hat, während die Thread.sleep() - Methode die Task ohne Behinderung weiter ausführt. Dies kann ein wichtiger Entscheidungsfaktor bei der Entscheidung sein, was zwischen diesen beiden zu verwenden ist.

+21

Punkt der Reihenfolge: Timer und TimerTask sind veraltet, und wurden tatsächlich von ExecutorService ersetzt, obwohl Ihr Punkt immer noch steht. – skaffman

+0

Danke für den Tipp, entschied ich mich für ExecutorService :) – Keshav

+0

Vielen Dank für die Antworten, gab mir sicherlich mehr Verständnis! – Keshav

Antwort

63

Der Vorteil von TimerTask ist, dass es Ihre Absicht viel besser ausdrückt (d. H. Lesbarkeit des Codes), und es hat bereits die Funktion cancel() implementiert.

Beachten Sie, dass es kann auch Ihr eigenes Beispiel in kürzerer Form geschrieben werden:

Timer uploadCheckerTimer = new Timer(true); 
uploadCheckerTimer.scheduleAtFixedRate(
    new TimerTask() { 
     public void run() { NewUploadServer.getInstance().checkAndUploadFiles(); } 
    }, 0, 60 * 1000); 
+0

Wenn der Timer für Everyday, 2 spezifische Zeit 9pm und 9am, ... verwendet wird, wie die Werte zu geben? auf den Code oben ... @Zed? – gumuruh

11

Timer/Timertask auch berücksichtigt die Ausführungszeit Ihrer Aufgabe, so wird es ein bisschen genauer sein . Und es behandelt besser Multithreading-Probleme (wie zum Beispiel Deadlocks etc. vermeiden). Und natürlich ist es normalerweise besser, einen gut getesteten Standardcode anstelle einer selbstgemachten Lösung zu verwenden.

+0

Das ist ein sehr guter Punkt, danke. – Ridcully

3

Es gibt ein entscheidendes Argument gegen die Verwaltung dieser Aufgabe mit Java-Threads und sleep Methode. Sie verwenden while(true), um unbegrenzt in der Schleife zu bleiben und den Thread durch Einschlafen in den Ruhezustand zu versetzen. Was passiert, wenn NewUploadServer.getInstance().checkAndUploadFiles(); einige synchronisierte Ressourcen belegt? Andere Threads können nicht auf diese Ressourcen zugreifen. Es kann zu einem Mangel kommen, der die gesamte Anwendung verlangsamen kann. Diese Art von Fehlern sind schwer zu diagnostizieren und es ist eine gute Idee, ihre Existenz zu verhindern.

Der andere aproach löst die Ausführung des Codes, der Ihnen wichtig ist, das heißt NewUploadServer.getInstance().checkAndUploadFiles(); durch die run() Methode Ihrer TimerTask beim Lassen andere Threads ruft die Ressourcen in der Zwischenzeit verwenden.

+16

Ich verstehe dieses Argument nicht. Beide Optionen starten die gleiche Methode aus einem Thread, beide Optionen schlafen in einem Thread, während sie auf die Ausführung warten. Es wird keine Hungerunterschiede zwischen den beiden Möglichkeiten geben. – satur9nine

4

Ich weiß nicht warum, aber ein Programm, das ich geschrieben habe, war mit Timern und es ist Heap Größe wurde ständig erhöht, sobald ich es in Thread/Schlaf Problem gelöst geändert.

+6

Der Timer erstellt eine Warteschlange von Aufgaben, die ständig aktualisiert wird. Wenn der Timer fertig ist, wird möglicherweise nicht sofort Müll gesammelt. Wenn Sie mehrere Timer erstellen, werden nur weitere Objekte auf dem Heap hinzugefügt. Thread.sleep() unterbricht nur den Thread, so dass der Speicheraufwand extrem niedrig ist. –

3

Wenn Sie Thread erhalten Ausnahme und wird getötet, das ist ein Problem. Aber TimerTask wird sich darum kümmern. Es wird unabhängig von einem Fehler im vorherigen Lauf ausgeführt.

1

Ich glaube, ich verstehe dein Problem, ich sehe etwas sehr ähnliches. Ich habe Timer, die wiederkehrend sind, einige alle 30 Minuten und einige alle paar Tage. Nach dem, was ich gelesen habe, und den Kommentaren, die ich sehe, sieht es so aus, als ob die Garbage-Collection nie ausgeführt wird, weil alle Aufgaben nie abgeschlossen sind. Ich würde denken, dass Garbage Collection ausgeführt würde, wenn ein Timer im Schlaf ist, aber ich sehe es nicht und laut der Dokumentation nicht.

Ich denke, dass das Erstellen neuer Threads abgeschlossen und Garbage Collection ermöglichen.

Jemand bitte beweisen Sie mir falsch, neu zu schreiben, was ich geerbt habe, wird ein Schmerz sein.