parar - reiniciar timer java
Java: programar una tarea en intervalos aleatorios (2)
Soy bastante nuevo en Java y estoy tratando de generar una tarea que se ejecutará cada 5 a 10 segundos, por lo que en cualquier intervalo en el área entre 5 y 10, incluyendo 10.
Intenté varias cosas pero nada está funcionando hasta ahora. Mi último esfuerzo está a continuación:
timer= new Timer();
Random generator = new Random();
int interval;
//The task will run after 10 seconds for the first time:
timer.schedule(task, 10000);
//Wait for the first execution of the task to finish:
try {
sleep(10000);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
//Afterwards, run it every 5 to 10 seconds, until a condition becomes true:
while(!some_condition)){
interval = (generator.nextInt(6)+5)*1000;
timer.schedule(task,interval);
try {
sleep(interval);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
}
"tarea" es un TimerTask. Lo que obtengo es:
Exception in thread "Thread-4" java.lang.IllegalStateException: Task already scheduled or cancelled
Entiendo desde aquí que un TimerTask no se puede reutilizar, pero no estoy seguro de cómo solucionarlo. Por cierto, mi TimerTask es bastante elaborado y dura al menos 1,5 segundos.
Cualquier ayuda será realmente apreciada, ¡gracias!
Cree un nuevo Timer
para cada tarea en su lugar, como ya lo hace: timer= new Timer();
Y si quiere sincronizar su código con sus tareas enhebradas, use semáforos y no sleep(10000)
. Esto podría funcionar si tienes suerte, pero definitivamente está mal porque no puedes estar seguro de que tu tarea realmente haya terminado.
tratar
public class Test1 {
static Timer timer = new Timer();
static class Task extends TimerTask {
@Override
public void run() {
int delay = (5 + new Random().nextInt(5)) * 1000;
timer.schedule(new Task(), delay);
System.out.println(new Date());
}
}
public static void main(String[] args) throws Exception {
new Task().run();
}
}