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