164 votes

Exécuter une fonction Java après un nombre spécifique de secondes

J'ai une fonction spécifique que je veux exécuter après 5 secondes. Comment puis-je faire cela en Java ?

J'ai trouvé javax.swing.timer, mais je n'arrive pas à comprendre comment l'utiliser. Il semble que je cherche quelque chose de beaucoup plus simple que ce que cette classe fournit.

Veuillez ajouter un exemple d'utilisation simple.

0 votes

Voulez-vous attendre 5 secondes et ensuite exécuter quelque chose ou voulez-vous continuer à faire quelque chose d'autre pendant ces 5 secondes ?

0 votes

Je veux continuer à faire autre chose

263voto

tangens Points 17733
new java.util.Timer().schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
            }
        }, 
        5000 
);

EDIT :

javadoc dit :

Lorsque la dernière référence vivante à un objet Timer disparaît et que toutes les tâches en suspens ont été exécutées, le fil d'exécution de la tâche du Timer se termine de manière élégante (et est soumis au ramassage des ordures). Cependant, cela peut prendre un temps arbitrairement long.

1 votes

Si vous exécutez ce code, vous aurez des fuites de fils. Veillez à nettoyer le timer lorsque vous avez terminé.

1 votes

@skaffman : J'ai ajouté une déclaration tirée de la javadoc. Faut-il vraiment faire le ménage après avoir appelé schedule ?

1 votes

Il se peut que tout aille bien, mais il se peut aussi que ce ne soit pas le cas. Si vous exécutez ce fragment de code plusieurs fois, vous aurez des fils libres sans aucun moyen d'y mettre de l'ordre.

64voto

skaffman Points 197885

Voici ce qu'il en est :

// When your program starts up
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

// then, when you want to schedule a task
Runnable task = ....    
executor.schedule(task, 5, TimeUnit.SECONDS);

// and finally, when your program wants to exit
executor.shutdown();

Il existe d'autres méthodes d'usine sur Executor que vous pouvez utiliser à la place, si vous voulez plus de threads dans le pool.

Et n'oubliez pas qu'il est important d'informer l'exécuteur testamentaire lorsque vous avez terminé. L'exécuteur shutdown() fermera proprement le pool de threads lorsque la dernière tâche sera terminée, et se bloquera jusqu'à ce que cela se produise. shutdownNow() met fin immédiatement au pool de threads.

1 votes

shutdown() ne bloque pas. awaitTermination() ne.

0 votes

shutdown() ne permet pas de soumettre de nouvelles tâches. shutdownNow() interrompt également les tâches (sans nécessairement y mettre fin immédiatement).

28voto

zpon Points 518

Exemple d'utilisation javax.swing.Timer

Timer timer = new Timer(3000, new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
    // Code to be executed
  }
});
timer.setRepeats(false); // Only execute once
timer.start(); // Go go go!

Ce code ne sera exécuté qu'une seule fois, et l'exécution se fait en 3000 ms (3 secondes).

Comme le mentionne Camickr, vous devriez consulter " Comment utiliser les chronomètres pour balançoires "pour une brève introduction.

0 votes

Juste ça Go go go go ! :-)

4voto

camickr Points 137095

Votre question initiale mentionne le "Swing Timer". Si votre question est en fait liée à SWing, alors vous devriez utiliser le Swing Timer et NON l'util.Timer.

Lisez la section du tutoriel Swing sur " Comment utiliser les minuteries "pour plus d'informations.

3voto

dale Points 644

Vous pouvez utiliser la fonction Thread.Sleep()

Thread.sleep(4000);
myfunction();

Votre fonction sera exécutée après 4 secondes. Cependant, cela risque d'interrompre tout le programme...

0 votes

Et il ne garantit que l'exécution au bout de 4 secondes, ce qui pourrait signifier au bout de 10 secondes également !

2 votes

Questzen, vous constaterez que todos les méthodes utilisées ici le font. En fait, même si vous planifiez quelque chose au niveau du système d'exploitation, vous ne pouvez généralement garantir qu'un temps minimum avant un événement.

0 votes

Ce n'est pas la question posée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X