analytics

Mostrando entradas con la etiqueta java Task. Mostrar todas las entradas
Mostrando entradas con la etiqueta java Task. Mostrar todas las entradas

lunes, 9 de enero de 2017

Timer y TimerTask, crear un scheduler


Uso de Timer y TimerTask para crear un scheduler

reloj


Vamos a ver como podemos implementar un Scheduler, o en castellano, un planificador de tareas. Emplearemos la clase Timer y la clase TimerTask. Para nosotros va a ser un hilo en permanente ejecución que podrá ejecutar tareas cuando se le programe, de manera puntual o de manera periódica. Este hilo principal o Scheduler, será singleton (una sola instancia en cada ejecución). Esto último lo conseguimos haciendo su constructor privado y accediendo a la instancia a través del método getInstance().

Es fácil




public class Scheduler implements Runnable {


    private Timer t;
    private static Scheduler scheduler = null;

    
    private Scheduler() {    
        t = new Timer();
    }

    public static Scheduler getInstance() {
        if (scheduler == null) {
            scheduler = new Scheduler();
        }
        return scheduler;
    }

    
    
    @Override
    public void run() {
        
        
        System.out.println("Ejecutando scheduler");        

        TareaCapturar tc =  new TareaCapturar();
        
        // ejecución periódica cada 10 min
t.schedule(tc.getCaptureTask(), 1000, 1000*60*10);
        // una ejecución puntual a los diez segundos de iniciarse 
        t.schedule(tc.getCaptureTask(), 1000*10); 
        
    }

    public void reIniciar(){
        t.cancel();
        t = new Timer();
    }

}


Ahora vamos a ver la clase TareaCapturar, la cual es la que contiene la tarea (TimerTask) que se ejecutará cada vez que el Timer del Scheduler la invoque. Cada vez que se ejecute la tarea, lo hará en un hilo independiente, de esta manera se consigue mayor fiabilidad en la ejecución.


public class TareaCapturar {
    
    
     public TimerTask getCaptureTask() {
        TimerTask tarea = new TimerTask() {

            @Override
            public void run() {
                
                
                // aquí vendrá el código de la tarea
                
                
            };
        };
        return tarea;
     }


Por lo tanto, tenemos un scheduler que se ejecutará permanentemente, e irá invocando en el tiempo nuevos hilos que ejecutarán la tarea implementada en la clase TareaCapturar. Una manera sencilla y ordenada de gestionar ejecuciones periódicas.