Timer & TimerTask versus Thread + Schlaf in Java

Ich fand ähnliche Fragen, die hier gestellt wurden, aber es gab keine Antworten zu meiner Zufriedenheit. Also formuliere die Frage noch einmal –

Ich habe eine Aufgabe, die regelmäßig erledigt werden muss (z. B. 1-Minuten-Intervalle). Was ist der Vorteil der Verwendung von Timertask & Timer, um dies zu tun, anstatt einen neuen Thread zu erstellen, 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-Snippet mit Thread und Sleep-

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

Ich muss mir wirklich keine Sorgen machen, wenn ich bestimmte Zyklen verpasse, wenn die Ausführung der Logik mehr als die Intervallzeit benötigt.

Bitte kommentieren Sie das ..

Vielen Dank,
-Keshav

Aktualisieren:
Vor kurzem habe ich einen weiteren Unterschied zwischen der Verwendung von Timer versus Thread.sleep () gefunden. 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.

    Der Vorteil von TimerTask ist, dass es Ihre Absicht viel besser zum Ausdruck bringt (dh Lesbarkeit des Codes), und es hat bereits die function cancel () implementiert.

    Beachten Sie, dass es sowohl in einer kürzeren Form als auch in Ihrem eigenen Beispiel geschrieben werden kann:

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

    Timer / TimerTask berücksichtigt auch die Ausführungszeit Ihrer Aufgabe, also wird es etwas genauer. 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.

    Ich weiß nicht warum, aber ein Programm, das ich geschrieben habe, verwendete Timer und seine Heap-Größe nahm ständig zu, sobald ich es in Thread / Schlaf-Problem geändert hatte.

    Es gibt ein entscheidendes Argument gegen die Verwaltung dieser Aufgabe mit Java-Threads und der sleep . Sie verwenden while(true) , um unbegrenzt in der Schleife zu bleiben und den Thread durch Einschlafen in den Ruhezustand zu versetzen. Was ist, wenn NewUploadServer.getInstance().checkAndUploadFiles(); nimmt einige synchronisierte Ressourcen auf. 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 Ansatz triggers die Ausführung des für Sie NewUploadServer.getInstance().checkAndUploadFiles(); Codes aus, dh NewUploadServer.getInstance().checkAndUploadFiles(); indem Sie die run() Methode Ihrer TimerTask während andere Threads die Ressourcen in der Zwischenzeit verwenden.

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

    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 ist und Garbage Collection ermöglicht.

    Jemand beweist mir bitte falsch, das Neuformulieren, was ich geerbt habe, wird ein Schmerz sein.