Como ejecutar un método a una hora especifica en Java

La clase Timer de java nos permite ejecutar parte de nuestro código a una hora especifica o después de un periodo de tiempo fijado y también nos ofrece la posibilidad de repetir la ejecución cada un intervalo de tiempo determinado tanto si se indica una hora para que se ejecute como si lo que se indica es un periodo de tiempo hasta que se ejecute nuestro código.

De esta forma podemos programar el envió de emails, la generación de informes, copias de seguridad, etc. para que se ejecuten a la hora que queramos y además con la posibilidad de repetirlo cada 2 horas, cada día, semana, mes o el tiempo que se desee únicamente usando las clases Timer y TimerTask.

Vamos a ver mediante un ejemplo como podemos ejecutar un método a la hora exacta que deseemos y que ejemplo más claro y más sencillo que un despertador. Por ejemplo vamos a hacer que el despertador «suene» de lunes a viernes a las 8 de la mañana, que el sábado no suene y que el domingo tampoco suene y que se apague para que la semana siguiente ya no suene.

Para programarlo a las 8 de la mañana obtenemos la fecha actual del sistema y ponemos la hora del despertador a las 8 de ese día si aun no han llegado o del día siguiente si ya es mas tarde y establecemos el tiempo de repetición en 24 horas para que se repita todos los días a la misma hora. Creamos el temporizador y le pasamos como parámetros un TimerTask (Temporizador lo veremos después) y la hora a la que tiene que ejecutarse y cada cuanto tiempo tiene que hacerlo.


package com.poi.temporizador;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Main {

    public static void main (String[] args) {
        
        Date horaDespertar = new Date(System.currentTimeMillis());
        
        Calendar c = Calendar.getInstance();
        c.setTime(horaDespertar);
        System.out.println(c.get(Calendar.DAY_OF_WEEK));
        // Si la hora es posterior a las 8am se programa la alarma para el dia siguiente
        if (c.get(Calendar.HOUR_OF_DAY) >= 22) {
            c.set(Calendar.DAY_OF_YEAR, c.get(Calendar.DAY_OF_YEAR) + 1);
        }
        
        c.set(Calendar.HOUR_OF_DAY, 8);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        
        horaDespertar = c.getTime();
        System.out.println(horaDespertar);
        System.out.println(c.get(Calendar.DAY_OF_WEEK));
        // El despertador suena cada 24h (una vez al dia)
        int tiempoRepeticion = 86400000; 
        
        // Programamos el despertador para que "suene" a las 8am todos los dias 
        Timer temporizador = new Timer();
        temporizador.schedule(new Temporizador(), horaDespertar, tiempoRepeticion);
        
    }
}

Si la parte de crear el Timer es sencilla el TimerTask no es más complicado ya que solamente hace falta crear una clase que extienda de TimerTask y sobrescribir el método run con lo que queremos que haga, en nuestro caso dependiendo del día de la semana sonara el despertador o no lo hará o se apagará.


package com.poi.temporizador;

import java.util.Calendar;
import java.util.TimerTask;

public class Temporizador extends TimerTask{

    @Override
    public void run() {
        Calendar diaActual = Calendar.getInstance();
        
        switch (diaActual.get(Calendar.DAY_OF_WEEK)) {
            case 1: // Es domingo puedes seguir durmiendo y se apaga el despertador
                System.out.println("Zzz...");
                this.cancel();
                System.out.println("Temporizador apagado.");
                break;
            case 2: // Durante los dias de diario suena el despertador
            case 3:
            case 4:
            case 5:
            case 6:
                System.out.println("Despierta!!!");
                break;
            case 7: // Es sabado puedes seguir durmiendo
                System.out.println("Zzz...");
                break;
        }
    }

}

Lo único destacable de esta clase es la forma en la que podemos hacer que el temporizador deje de ejecutarse aunque tenga un tiempo de repetición que le haga que se repita cada cierto tiempo y es tan sencillo como usar el método cancel() de TimerTask.

De esta forma tan sencilla podemos programar en java la ejecución de un método o un fragmento de código en el momento preciso que queramos.

Como siempre si quieres descargarte el proyecto completo para probarlo puedes hacerlo desde este enlace.