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