Comment planifier une tâche pour qu'elle s'exécute une fois?
Je veux retarder de faire quelque chose le long des lignes de paramètre de compte à rebours qui va "faire une chose" après un certain laps de temps.
Je veux le reste de mon programme de continuer à fonctionner pendant que j'attends, alors, j'ai essayé de faire mon propre Thread
qui contenait une minute de retard:
public class Scratch {
private static boolean outOfTime = false;
public static void main(String[] args) {
Thread countdown = new Thread() {
@Override
public void run() {
try {
//wait a while
System.out.println("Starting one-minute countdown now...");
Thread.sleep(60 * 1000);
//do the thing
outOfTime = true;
System.out.println("Out of time!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
countdown.start();
while (!outOfTime) {
try {
Thread.sleep(1000);
System.out.println("do other stuff here");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Bien que cela a fonctionné, plus ou moins, il me semblait qu'il y devrait y avoir une meilleure façon de le faire.
Après quelques recherches, j'ai trouvé un tas de questions de ce genre, mais ils n'ont pas vraiment répondre à ce que je suis en train de faire:
- Comment puis-je planifier une tâche à exécuter à intervalles réguliers?
- Comment je peux utiliser mon TimerTask tous les jours 2 H
- Comment faire pour exécuter certaines tâches chaque jour à un moment donné à l'aide de ScheduledExecutorService?
- Java exécuter la tâche avec un certain nombre de tentatives et un délai d'attente
Je n'ai pas besoin de rien de compliqué, je veux juste faire une seule chose après un certain laps de temps, tout en laissant le reste du programme continuent de fonctionner.
Comment dois-je aller sur la planification d'une tâche de temps de "faire quelque chose"?
source d'informationauteur azurefrog
Vous devez vous connecter pour publier un commentaire.
Tandis que le
java.util.Timer
utilisé pour être une bonne façon de planifier des tâches à venir, il est maintenant préférable1 au lieu d'utiliser les classes de lajava.util.concurrent
paquet.Il y a un
ScheduledExecutorService
qui est conçu spécifiquement pour exécuter une commande après un délai (ou à exécuter périodiquement, mais ce n'est pas pertinente à cette question).Il a un
annexe(Runnable, long, TimeUnit)
méthode quiÀ l'aide d'un
ScheduledExecutorService
vous pouvez réécrire votre programme comme ceci:Une des belles choses que vous obtenez en faisant les choses de cette façon est la
ScheduledFuture<?>
objet que vous recevez à partir de l'appelantschedule()
.Cela vous permet de vous débarrasser de l'extra
boolean
variable, et il suffit de vérifier directement si l'exécution du travail.Vous pouvez également annuler la tâche planifiée, si vous ne voulez pas attendre plus par l'appel de sa
annuler()
méthode.1Voir Java Minuterie vs ExecutorService? pour des raisons d'éviter d'utiliser une
Timer
en faveur d'uneExecutorService
.