¿Cómo programar una tarea periódica en Java?

Resuelto Ariyan asked hace 13 años • 13 respuestas

Necesito programar una tarea para que se ejecute en un intervalo de tiempo fijo. ¿Cómo puedo hacer esto con soporte de intervalos largos (por ejemplo, cada 8 horas)?

Actualmente estoy usando java.util.Timer.scheduleAtFixedRate. ¿ Admite java.util.Timer.scheduleAtFixedRatelargos intervalos de tiempo?

Ariyan avatar Oct 19 '11 04:10 Ariyan
Aceptado

Utilice un ScheduledExecutorService :

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
b_erb avatar Oct 18 '2011 21:10 b_erb

Deberías echarle un vistazo a Quartz , es un framework java que funciona con las ediciones EE y SE y permite definir trabajos para ejecutar en un tiempo específico.

Jorge avatar Oct 18 '2011 21:10 Jorge

Prueba 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 precisa:

 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));
}
Sentary avatar Sep 19 '2013 13:09 Sentary

Utilice Google Guava AbstractScheduledServicecomo se indica a continuación:

public class ScheduledExecutor extends AbstractScheduledService {

   @Override
   protected void runOneIteration() throws Exception {
      System.out.println("Executing....");
   }

   @Override
   protected Scheduler scheduler() {
        return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS);
   }

   @Override
   protected void startUp() {
       System.out.println("StartUp Activity....");
   }


   @Override
   protected void shutDown() {
       System.out.println("Shutdown Activity...");
   }

   public static void main(String[] args) throws InterruptedException {
       ScheduledExecutor se = new ScheduledExecutor();
       se.startAsync();
       Thread.sleep(15000);
       se.stopAsync();
   }
}

Si tiene más servicios como este, será bueno registrar todos los servicios en ServiceManager, ya que todos los servicios se pueden iniciar y detener juntos. Lea aquí para obtener más información sobre ServiceManager.

Aride Chettali avatar Jul 21 '2014 16:07 Aride Chettali

Si desea seguir con java.util.Timer, puede usarlo para programar en intervalos de tiempo grandes. Simplemente pasas el período al que estás apuntando. Consulta la documentación aquí .

Belizzle avatar Oct 18 '2011 21:10 Belizzle