05 junio 2012

Scheduler o Programador de tareas en Java Version2

Otra versión de un scheduler o programador de tareas y esta vez para máquinas virtuales jdk 1.4 o anteriores. Las clases utilizadas son  java.util.Timer y   java.util.TimerTask.
Hay dos Timer y dos Task, un Timer que arranca la alarma y otro que la para, una Task que ejecuta un contador y otra que para las Tasks y los Timers

import java.util.Timer;

import java.util.TimerTask;



public class Alarma {

private long tiempoCarenciaMilisegundos = 3000;

private long tiempoEjecucionAlarmaTask = 3000;

private AlarmaTimer alarmaTimer = new AlarmaTimer();

private AlarmaTask alarmaTask = new AlarmaTask();

private AlarmaParaTimer alarmaParaTimer = new AlarmaParaTimer();

private AlarmaParaTask alarmaPararTask = new AlarmaParaTask();



/**

 * @param args

 */

public static void main(String[] args) {

System.out.println("Inicio del Main");

Alarma alarma = new Alarma(1000, 3000);

alarma.arrancaAlarmaTimer();

alarma.arrancaAlarmaParaTimer();

System.out.println("Fin del Main");

}



/**

 * Constructor de la clase

 * @param tiempoCarenciaMilisegundos

 * @param tiempoEjecucionAlarmaTask

 */



public Alarma(long tiempoCarenciaMilisegundos,

long tiempoEjecucionAlarmaTask) {

this.tiempoCarenciaMilisegundos = tiempoCarenciaMilisegundos;

this.tiempoEjecucionAlarmaTask = tiempoEjecucionAlarmaTask;

}

private void arrancaAlarmaTimer() {

alarmaTimer.arrancaTimer();

}

private void arrancaAlarmaParaTimer() {

alarmaParaTimer.arrancaParaTimer();

}

public class AlarmaTask extends TimerTask {

private int contador = 0;

public void run() {

System.out.println("Se ejecuta la alarma " + contador++);

}

}

public class AlarmaTimer extends Timer {

private final Timer tiempo = new Timer();

public void arrancaTimer() {

tiempo.scheduleAtFixedRate(alarmaTask, tiempoCarenciaMilisegundos,

tiempoEjecucionAlarmaTask);

};

}

public class AlarmaParaTask extends TimerTask {

public void run() {

System.out.println("Se ejecuta la cancelacion de la alarma ");

alarmaTask.cancel();

alarmaTimer.cancel();

alarmaTimer.purge();

System.out.println("Se ejecuta el parado de este timer/task ");

alarmaPararTask.cancel();

alarmaParaTimer.cancel();

alarmaParaTimer.purge();

System.exit(0);

}

}

public class AlarmaParaTimer extends Timer {

private final Timer tiempo = new Timer();

public void arrancaParaTimer() {

tiempo.scheduleAtFixedRate(alarmaPararTask, 20000, 1);

};
}
}

01 junio 2012

Scheduler o Programador de tareas en Java

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();
}
}

}