Hoy posteo un pedacito de código de esos que suelo utilizar de vez en cuando para ejecutar en background tareas que se deben de realizar a horas intempestivas sin que moleste a nadie . Se trata de un programador de tareas o scheduler utilizando la clase Executors del paquete java.util.concurrent para versiones iguales o superiores 1.5 de java.
public class Schedule {
 private ScheduledExecutorService programador;
 private long tiempoRetardo;
 private long tiempoEjecucion;
 private long tiempoParada;
 private static final int NUMERO_THREADS = 1;
 private static final boolean PUEDE_PARAR_TAREA_SI_EJECUTA = false;
 public static void main(String[] args) {
  System.out.println("Inicio de main del proceso");
  Schedule execute = new Schedule(3, 1, 20);
  execute.activaProcesoYPara();
  System.out.println("Fin del main del proceso");
 }
 /**
  * Constructor
  * 
  * @param tiempoInicial
  * @param tiempoEjecucion
  * @param tiempoParada
  */
 public Schedule(long tiempoRetardo, long tiempoEjecucion, long tiempoParada) {
  this.tiempoRetardo = tiempoRetardo;
  this.tiempoEjecucion = tiempoEjecucion;
  this.tiempoParada = tiempoParada;
  programador = Executors.newScheduledThreadPool(NUMERO_THREADS);
 }
 /**
  * Metodo que activa el programador 
  * 
  * el proceso se ejecutara 17 veces(contador = 17) ya que hay 
  * un retardo de 3 segundos. El proceso de parada tiene un ejecucion de 20
  * segundos.
  * 
  */
 public void activaProcesoYPara() {
  Runnable ejecucionTarea = new EjecucionTarea();
  ScheduledFuture programadorTareaFutura = programador.scheduleWithFixedDelay(ejecucionTarea, tiempoRetardo,
    tiempoEjecucion, TimeUnit.SECONDS);
  Runnable paradaProceso = new PararTarea(programadorTareaFutura);
  programador.schedule(paradaProceso, tiempoParada, TimeUnit.SECONDS);
 }
 /**
  * Clase que se utiliza para la ejecucion de la tarea
  * 
  */
 private static final class EjecucionTarea implements Runnable {
  /**
   * Variable contador
   */
  private int contador;
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Runnable#run()
   */
  public void run() {
   ++contador;
   System.out.println("valor del contador " + contador);
  }
 }
 /**
  * 
  * Clase que se utiliza para parar la tarea que se ejecuta en el 
  * {@link ScheduledFuture}
  * 
  */
 private final class PararTarea implements Runnable {
  private ScheduledFuture programadorFuturo;
  /**
   * Constructor.
   * 
   * @param programadorTareaFuturo
   */
  public PararTarea(ScheduledFuture programadorTareaFuturo) {
   programadorFuturo = programadorTareaFuturo;
  }
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Runnable#run()
   */
  public void run() {
   System.out.println("Parando la tarea");
   programadorFuturo.cancel(PUEDE_PARAR_TAREA_SI_EJECUTA);
   programador.shutdown();
  }
 }
}
 
No hay comentarios:
Publicar un comentario