Re ejecutar un timer

Tengo un problema, nose como hacer para volver a ejecutar un timer.
Me sale este error:
Exception in thread "Timer-0" java.lang.IllegalStateException: Task already scheduled or cancelled
at java.util.Timer.sched(Unknown Source)
at java.util.Timer.schedule(Unknown Source)
at com.cuponium.timer.TimerPrincipal.comenzar(TimerPrincipal.java:71)
at com.cuponium.timer.TimerPrincipal$1.run(TimerPrincipal.java:25)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
-------------------------------------------
Este es mi codigo:
public class TimerPrincipal {
int i=0;
String fechaHora= "01/08/2011 09:55:30";
Date fechaHoraDate=null;
// Clase en la que está el código a ejecutar
TimerTask timerTask = new TimerTask()
{
public void run()
{
System.out.println("Hola!");
agregarUnDia();
comenzar();
}
};
public Date agregarUnDia(){
Date fecha=null;
Calendar cal=Calendar.getInstance();
cal.setTime(fechaHoraDate);
cal.add(Calendar.DATE, 1);
//Calendar cal2=Calendar.getInstance();
fecha =cal.getTime();
fechaHoraDate=cal.getTime();
System.out.println("Agreagada:"+fechaHoraDate);
return fecha;
}

public void comenzar(){
if(i==0){
SimpleDateFormat forma = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
try {
fechaHoraDate=forma.parse(fechaHora);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
}
System.out.println(fechaHoraDate);
Timer timer = new Timer();
timer.schedule(timerTask, fechaHoraDate);
}
public static void main(String[] args) {new TimerPrincipal();}
public TimerPrincipal() {comenzar();}
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de WinDoctor

Quita comenzar();

En el método run vuelves a llamar al método comenzar y en el método comenzar utilizas de nueva cuenta el TimerTask. Si lo que deseas es ejecutar el timer cada cierto tiempo, en el método schedule esta sobrecargado y recibe el periodo...

 

Imagen de ezamudio

ScheduledExecutor

Es más recomendable usar el   que el  . La razón es que el ScheduledExecutorService puede echar a andar tareas periódicas de tipo   y  , que son interfaces de uso más general que  , que sólo sirve para usar con el  . Además, un ScheduledExecutor puede tener varios hilos de ejecución o uno solo, según se configure, para ejecutar las tareas que se le indique.

Imagen de GCORREAGEEK

Xuxa no me habian presentado

Xuxa no me habian presentado al ScheduledExecutorService.
Buena vox gracias lo voy a revisar.