calendrier des tâches java timer


En lisant sur Stack Overflow, j'ai vu que beaucoup d'entre vous ne recommandent pas d'utiliser la tâche de minuterie. Hmmm... mais j'ai déjà implémenté ceci:

, j'ai ce code:

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

Le fait est que le travail de myTimerTask dure un certain temps.

Je voudrais ce comportement:

  1. attendez 60 sec.
  2. faire la tâche pendant un certain temps (par exemple 40 - 100 sec).
  3. tâche terminée.
  4. attendez 60 secondes.
  5. faire la tâche pendant un certain temps (par exemple 40 - 100 sec).

, Mais le code ci-dessus se comporte comme ceci

  1. attendez 60 sec.
  2. faire la tâche pendant un certain temps (par exemple 40 - 100 sec).
  3. tâche terminée
  4. faire la tâche pendant un certain temps (par exemple 40 - 100 sec).

Étant donné que la durée de la tâche est supérieure à 60, la minuterie démarre la tâche immédiatement après la fin de la tâche. Mais je voudrais qu'il atteigne à nouveau.

Author: Rob Hruska, 2010-10-28

1 answers

Cela fonctionne. La clé est d'avoir la tâche elle-même (une fois terminée) planifier la prochaine occurrence de la tâche.

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

, Qui imprime:

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

Voici à quoi cela ressemble si vous extrayez les deuxièmes composants des horodatages (pour plus de clarté):

$ 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

Il suffit de remplacer les 10s 60. s.

 11
Author: Rob Hruska, 2010-10-28 16:37:54