temporizador reiniciar parar para metodos hacer detener crear como codigo java random timer timertask

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