Как позволить таймеру пропустить задачу, когда последняя еще не завершена?

Вот фрагмент кода:

Timer t = new Timer();
TimerTask task = new TimerTask() {
    int i = 0;
    int longTimeJobPoint = 2;
    @Override
    public void run() {
        System.out.println(new Date());
        if(++i == longTimeJobPoint)    {
            try {
                System.out.println("sleeping time...");
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

};

//every 10 sec
t.scheduleAtFixedRate(task, new Date(), 10000);

Результат выглядит следующим образом:

Sat Oct 19 10:44:59 CST 2013
Sat Oct 19 10:45:09 CST 2013
sleeping time...
Sat Oct 19 10:45:39 CST 2013  //piled task
Sat Oct 19 10:45:39 CST 2013  //piled task
Sat Oct 19 10:45:39 CST 2013
Sat Oct 19 10:45:49 CST 2013

Как мы видим, когда Thread.sleep() задерживается на 30 секунд, запланированный таймер складывает задачи, которые должны запускаться каждые 10 секунд. Я хочу пропустить задачи, которые были отложены из-за того, что последняя задача еще не завершена. И вывод должен быть таким:

Sat Oct 19 10:44:59 CST 2013
Sat Oct 19 10:45:09 CST 2013
sleeping time...
Sat Oct 19 10:45:39 CST 2013
Sat Oct 19 10:45:49 CST 2013

Может ли кто-нибудь помочь мне? Большое спасибо!


person Judking    schedule 19.10.2013    source источник


Ответы (1)


Вы должны использовать выполнение с фиксированной задержкой вместо этого запускает следующую задачу на основе времени завершения предыдущей задачи, а не времени ее начала. Если Timer не поддерживает то, что вам нужно, обратите внимание на более мощную библиотеку планирования, например Quartz.

person Ryan Stewart    schedule 19.10.2013