Java java.util.Timer ist eine Hilfsklasse, die verwendet werden kann, um einen Thread zu planen, der zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt werden soll. Die Klasse Java Timer kann verwendet werden, um eine Aufgabe einmalig oder in regelmäßigen Intervallen auszuführen.
Java TimerTask
java.util.TimerTask ist eine abstrakte Klasse, die das Runnable-Interface implementiert, und wir müssen diese Klasse erweitern, um unsere eigene TimerTask zu erstellen, die mithilfe der Java Timer-Klasse geplant werden kann.
Java Timer Beispiel
Die Java Timer-Klasse ist threadsicher, und mehrere Threads können ein einzelnes Timer-Objekt ohne externe Synchronisation teilen. Die Timer-Klasse verwendet java.util.TaskQueue, um Aufgaben in regelmäßigen Abständen hinzuzufügen. Zu jedem Zeitpunkt kann nur ein Thread die TimerTask ausführen. Wenn beispielsweise ein Timer alle 10 Sekunden ausgeführt wird, die Ausführung eines einzelnen Threads jedoch 20 Sekunden dauert, fügt das Timer-Objekt weiterhin Aufgaben zur Warteschlange hinzu. Sobald ein Thread beendet ist, benachrichtigt er die Warteschlange, und ein anderer Thread beginnt mit der Ausführung. Die Java Timer-Klasse verwendet die Objektmethoden wait und notify, um Aufgaben zu planen. Hier ist ein einfaches Programm für ein Java Timer- und TimerTask-Beispiel.
package com.journaldev.threads;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Timer task started at:"+new Date());
completeTask();
System.out.println("Timer task finished at:"+new Date());
}
private void completeTask() {
try {
//Annahme: Die Aufgabe dauert 20 Sekunden
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//Timer-Task als Daemon-Thread ausführen
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//Nach einiger Zeit abbrechen
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Beachten Sie, dass die Ausführung eines Threads 20 Sekunden dauern wird, aber das Java Timer-Objekt ist so geplant, dass die Aufgabe alle 10 Sekunden ausgeführt wird. Hier ist die Ausgabe des Programms:
TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012
Die Ausgabe bestätigt, dass Timer darauf wartet, dass eine Aufgabe abgeschlossen ist, bevor er sie erneut startet. Das Java Timer-Objekt kann erstellt werden, um die zugehörigen Aufgaben als Daemon-Thread auszuführen. Die `cancel()`-Methode des Timer cancel() wird verwendet, um den Timer zu beenden und geplante Aufgaben zu verwerfen, ohne jedoch die gerade ausgeführte Aufgabe zu beeinträchtigen. Wenn der Timer als Daemon-Thread läuft, wird er sich beenden, sobald alle Benutzerthreads ihre Ausführung beendet haben, unabhängig davon, ob wir ihn abbrechen oder nicht. Die Timer-Klasse enthält mehrere schedule()-Methoden, um eine Aufgabe einmalig zu einem bestimmten Datum oder nach einer Verzögerung auszuführen. Es gibt mehrere scheduleAtFixedRate()-Methoden, um eine Aufgabe periodisch mit einem bestimmten Intervall auszuführen. Bei der Planung von Aufgaben mit dem Timer sollten Sie sicherstellen, dass das Zeitintervall größer ist als die normale Thread-Ausführung, da andernfalls die Warteschlangengröße der Aufgaben ständig wächst und schließlich die Aufgabe immer ausgeführt wird. Das war eine kurze Übersicht über Java Timer und Java TimerTask.
Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example