Meine Antwort wäre, Timer
nicht zu verwenden, es ist veraltet. Seit Java5 wurde Timer
durch die ScheduledExecutorService
ersetzt, die viel flexibler und einfacher zu bedienen ist. Sie erhalten eine bessere Kontrolle darüber, wie der Scheduler funktioniert, die Art von Kontrolle, die Sie nicht mit Timer
erhalten.
Sie erstellen eine mit der Fabrikklasse Executors, die eine Reihe von Factory-Methoden hat. Diejenige, die Sie bei suchen sollte ist newSingleThreadScheduledExecutor, was genau tun sollten, was Sie suchen:
Schafft ein Single-Threaded Executor , die Befehle planen können nach einer bestimmten Verzögerung ausgeführt werden, oder auszuführen regelmäßig. Tasks sind garantiert sequenziell ausgeführt werden, und nicht mehr als eine Aufgabe wird bei jeder gegebenen Zeit aktiv sein.
Mit einem ScheduledExecutorService
statt Subklassifizieren TimerTask
, Unterklasse Sie Runnable
direkt, und dann die Aufgabe des Testamentsvollstreckers einreichen. Es gibt verschiedene Methoden auf dem Testamentsvollstrecker, müssen Sie wählen, welche für Ihre Bedürfnisse geeignet ist (die javadoc für ScheduledExecutorService
sorgfältig lesen), aber der Kern ist so etwas wie dieses:
// initialise the executor
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
while (tasksRemaining) {
// create your task
Runnable task = ....;
// submit it to the executor, using one of the various scheduleXYZ methods
executor.schedule(task, delay, unit);
}
// when everything is finished, shutdown the executor
executor.shutdown();
Wie immer die javadoc lesen.
Wenn es veraltet ist und ersetzt wurde, sollte es nicht als @deprecated markiert werden? –
Meiner Meinung nach, ja, sollte es, aber Suns Regeln über die Missbilligung sind ein bisschen verwirrend. Funktional bietet "Timer"/"TimerTask" nichts über das Executor-Framework. – skaffman
Könnten Sie bitte ein kleines Beispiel für die Verwendung von newSingleThreadScheduledExecutor zeigen? Ich bin neu in Java, und ich habe noch nie von Executoren gehört. Danke – Andrey