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:
- attendez 60 sec.
- faire la tâche pendant un certain temps (par exemple 40 - 100 sec).
- tâche terminée.
- attendez 60 secondes.
- faire la tâche pendant un certain temps (par exemple 40 - 100 sec).
, Mais le code ci-dessus se comporte comme ceci
- attendez 60 sec.
- faire la tâche pendant un certain temps (par exemple 40 - 100 sec).
- tâche terminée
- 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.
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 10
s 60
. s.