not - Temporizador Java
timer java 8 (3)
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.
Estoy tratando de usar un temporizador para programar un evento recurrente en una aplicación. Sin embargo, quiero poder ajustar el período en el que el evento se dispara en tiempo real (según 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 programada 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.
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.....
}
}