Uso de Timer y TimerTask para crear un scheduler
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 mint.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.