Java: планирование задачи через случайные промежутки времени

Я новичок в Java и пытаюсь сгенерировать задачу, которая будет выполняться каждые 5-10 секунд, то есть с любым интервалом в диапазоне от 5 до 10, включая 10.

Я пробовал несколько вещей, но пока ничего не работает. Моя последняя попытка ниже:

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

«задача» — это TimerTask. Что я получаю:

Exception in thread "Thread-4" java.lang.IllegalStateException: Task already scheduled or cancelled

Из здесь я понял, что TimerTask нельзя использовать повторно, но я не уверен, как это исправить. Кстати, мой TimerTask довольно сложный и длится не менее 1,5 секунд.

Любая помощь будет очень признательна, спасибо!


person idpolitis    schedule 18.01.2013    source источник


Ответы (2)


пытаться

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();
    }
}
person Evgeniy Dorofeev    schedule 18.01.2013

Вместо этого создайте новую Timer для каждой задачи, как вы уже делали: timer= new Timer();

И если вы хотите синхронизировать свой код с многопоточными задачами, используйте семафоры, а не sleep(10000). Это может сработать, если вам повезет, но это определенно неправильно, потому что вы не можете быть уверены, что ваша задача действительно завершена.

person m0skit0    schedule 18.01.2013
comment
Спасибо за ваш ответ. У меня есть только одна задача, которая будет выполняться заданное количество раз одна за другой. Как вы думаете, мне все еще нужно использовать семафоры? Кроме того, если я создаю новый таймер для каждого времени выполнения задачи, означает ли это, что мне нужен массив таймеров или что-то в этом роде? - person idpolitis; 18.01.2013
comment
Вы сказали, что хотите дождаться завершения первой задачи. Для этого нужен семафор. Вам не нужно следить за таймерами, если вы этого не хотите. Позже они будут автоматически освобождены GC. - person m0skit0; 19.01.2013