Intenta de esta manera ->
En primer lugar, cree una clase TimeTask que ejecute su tarea, se ve así:
public class CustomTask extends TimerTask {
public CustomTask(){
//Constructor
}
public void run() {
try {
// Your task process
} catch (Exception ex) {
System.out.println("error running thread " + ex.getMessage());
}
}
}
luego, en la clase principal, crea una instancia de la tarea y la ejecuta periódicamente iniciada en una fecha específica:
public void runTask() {
Calendar calendar = Calendar.getInstance();
calendar.set(
Calendar.DAY_OF_WEEK,
Calendar.MONDAY
);
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 40);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Timer time = new Timer(); // Instantiate Timer Object
// Start running the task on Monday at 15:40:00, period is set to 8 hours
// if you want to run the task immediately, set the 2nd parameter to 0
time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8));
}
TimeUnitaplica tanto a lainitialDelaycomo a laperiod. La ejecución cada 24 horas terminará siendo interrumpida cuando se active el horario de verano, pero unaTimeUnitdeDAYSno le permite especificar un grano finoinitialDelay. (Creo que la implementación interna ScheduledExecutorService se convierteDAYSa nanosegundos de todos modos).