Java java.util.Timer es una clase de utilidad que se puede utilizar para programar un hilo para que se ejecute en algún momento en el futuro. La clase Java Timer se puede utilizar para programar una tarea para que se ejecute una vez o para que se ejecute a intervalos regulares.
Java TimerTask
java.util.TimerTask es una clase abstracta que implementa la interfaz Runnable y debemos extender esta clase para crear nuestra propia TimerTask que se puede programar utilizando la clase java Timer.
Ejemplo de Java Timer
La clase Timer de Java es segura para subprocesos y múltiples subprocesos pueden compartir un solo objeto Timer sin necesidad de sincronización externa. La clase Timer utiliza java.util.TaskQueue para agregar tareas a intervalos regulares dados y en cualquier momento puede haber solo un hilo ejecutando TimerTask, por ejemplo, si está creando un Timer para ejecutar cada 10 segundos pero la ejecución de un solo hilo toma 20 segundos, entonces el objeto Timer seguirá agregando tareas a la cola y tan pronto como un hilo haya terminado, notificará a la cola y otro hilo comenzará a ejecutarse. La clase Timer de Java utiliza los métodos Object wait y notify para programar las tareas. Aquí hay un programa simple para un ejemplo de Timer y TimerTask en Java.
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 {
//suponiendo que toma 20 segundos completar la tarea
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//ejecutando la tarea del temporizador como hilo demonio
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//cancelar después de un tiempo
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();
}
}
}
Observe que la ejecución de un solo hilo tomará 20 segundos pero el objeto Timer de Java está programado para ejecutar la tarea cada 10 segundos. Aquí está la salida del programa:
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
La salida confirma que si una tarea ya está ejecutándose, Timer esperará a que termine y una vez finalizada, volverá a iniciar la próxima tarea de la cola. El objeto Timer de Java se puede crear para ejecutar las tareas asociadas como un hilo demonio. El método Timer cancel() se utiliza para terminar el temporizador y descartar cualquier tarea programada, sin embargo, no interfiere con la tarea que se está ejecutando actualmente y permite que termine. Si el temporizador se ejecuta como hilo demonio, ya sea que lo cancelemos o no, terminará tan pronto como todos los hilos de usuario hayan terminado de ejecutarse. La clase Timer contiene varios métodos schedule() para programar una tarea para que se ejecute una vez en una fecha dada o después de cierto retraso. Hay varios métodos scheduleAtFixedRate() para ejecutar una tarea periódicamente con cierto intervalo. Al programar tareas usando Timer, debes asegurarte de que el intervalo de tiempo sea mayor que la ejecución normal del hilo, de lo contrario, el tamaño de la cola de tareas seguirá creciendo y eventualmente la tarea siempre se estará ejecutando. Eso es todo para un breve resumen sobre Java Timer y Java TimerTask.
Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example