расписание задач таймера Java - PullRequest
5 голосов
/ 28 октября 2010

Из чтения о переполнении стека я видел, что многие из вас не рекомендуют использовать Timer Task. Хммм ... но я уже реализовал это:

У меня есть этот код:

detectionHandlerTimer.schedule(myTimerTask, 60 * 1000, 60 * 1000);

Дело в том, что работа myTimerTask длится некоторое время.

Мне бы хотелось, чтобы это поведение:

  1. подождите 60 сек.
  2. выполнять задание в течение некоторого времени (например, 40 - 100 секунд).
  3. задание выполнено.
  4. подождите 60 секунд.
  5. выполнять задание в течение некоторого времени (например, 40 - 100 секунд).

Но приведенный выше код ведет себя так

  1. подождите 60 сек.
  2. выполнять задание в течение некоторого времени (например, 40 - 100 секунд).
  3. задание выполнено
  4. выполнять задание в течение некоторого времени (например, 40 - 100 секунд).

Поскольку длительность задачи больше 60, таймер запускает задачу сразу после ее завершения. Но я бы хотел снова подождать.

1 Ответ

11 голосов
/ 28 октября 2010

Это работает.Ключ в том, чтобы сама задача (после ее завершения) планировала следующее ее выполнение.

import java.util.Timer;
import java.util.TimerTask;

public class TaskManager {

    private Timer timer = new Timer();

    public static void main(String[] args) {
        TaskManager manager = new TaskManager();
        manager.startTask();
    }

    public void startTask() {
        timer.schedule(new PeriodicTask(), 0);
    }

    private class PeriodicTask extends TimerTask {
        @Override
        public void run() {
            System.out.println(System.currentTimeMillis() + " Running");

            /* replace with the actual task */
            try {
                Thread.sleep(15 * 1000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            /* end task processing */

            System.out.println(System.currentTimeMillis() + " Scheduling 10 seconds from now");
            timer.schedule(new PeriodicTask(), 10 * 1000);
        }
    }
}

Что печатает:

$ javac TaskManager.java && java TaskManager
1288282514688 Running
1288282529711 Scheduling 10 seconds from now
1288282539712 Running
1288282554713 Scheduling 10 seconds from now
1288282564714 Running

Вот как это выглядит, если вы извлекаетевторые компоненты временных меток (для ясности):

$ javac TaskManager.java && java TaskManager
14                                    Running
29 (+15 seconds execution)            Scheduling 10 seconds from now
39 (+10 seconds delay until next run) Running
54 (+15 seconds execution)            Scheduling 10 seconds from now
64 (+10 seconds delay until next run) Running

Просто замените 10 s на 60 s.

...