Temporizador Java

Estoy tratando de usar un temporizador para progtwigr un evento recurrente en una aplicación. Sin embargo, quiero poder ajustar el período en el cual el evento se dispara en tiempo real (de acuerdo con la entrada de los usuarios).

Por ejemplo:

public class HelperTimer extends TimerTask { private Timer timer; //Default of 15 second between updates private int secondsToDelay = 15; public void setPeriod(int seconds) { this.secondsToDelay = seconds; long delay = 1000; // 1 second long period = 1000*secondsToDelay; // seconds if (timer != null) { timer.cancel(); } System.out.println(timer); timer = new Timer(); System.out.println(timer); timer.schedule(this, delay, period); } public int getPeriod() { return this.secondsToDelay; } } 

Luego comienzo una nueva instancia de esta clase y llamo a su función de período establecido. Sin embargo, cuando hago eso, obtengo una excepción de estado Ilegal. Puede ver System.out.println (timer); allí porque estoy comprobando, y sí, son dos temporizadores diferentes … así que ¿por qué recibo una IllegalStateException cuando trato de ejecutar una llamada progtwigda en una nueva instancia de Timer!?!?!?!

 java.util.Timer@c55e36 java.util.Timer@9664a1 Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Task already scheduled or cancelled at java.util.Timer.sched(Unknown Source) at java.util.Timer.schedule(Unknown Source) at HelperTimer.setPeriod(HelperTimer.java:38) 

No puede reutilizar un TimerTask como lo hace aquí.

Porición relevante de Timer :

 private void sched(TimerTask task, long time, long period) { if (time < 0) throw new IllegalArgumentException("Illegal execution time."); synchronized(queue) { if (!thread.newTasksMayBeScheduled) throw new IllegalStateException("Timer already cancelled."); synchronized(task.lock) { //Right here's your problem. // state is package-private, declared in TimerTask if (task.state != TimerTask.VIRGIN) throw new IllegalStateException( "Task already scheduled or cancelled"); task.nextExecutionTime = time; task.period = period; task.state = TimerTask.SCHEDULED; } queue.add(task); if (queue.getMin() == task) queue.notify(); } } 

Tendrá que refactorizar su código para que pueda crear un nuevo TimerTask, en lugar de volver a utilizar uno.

Me parece extraño tener un TimerTask con su propio temporizador dentro. Mal diseño. Los separaría totalmente y haría que la implementación de TimerTask se transfiriera a un temporizador, y pondría toda esa lógica sobre cómo manipular el período dentro de otra clase que proporciona una interfaz para hacerlo. Permita que esa clase cree una instancia de TimerTimer y TimerTask y envíelos a hacer su trabajo.

  import java.util.*; class TimeSetting { public static void main(String[] args) { Timer t = new Timer(); TimerTask time = new TimerTask() { public void run() { System.out.println("Executed......"); } }; t.scheduleAtFixedRate(time, 4000, 3000); // The task will be started after 4 secs and // for every 3 seconds the task will be continuously executed..... } }