Comment retarder l'exécution du code en Java

1. Introduction

Il est relativement courant que les programmes Java ajoutent un délai ou une pause dans leur fonctionnement. Cela peut être utile pour le rythme des tâches ou pour suspendre l'exécution jusqu'à ce qu'une autre tâche soit terminée.

Ce didacticiel décrit deux façons d'implémenter des retards en Java.

2. Une approche basée sur le fil

Lorsqu'un programme Java s'exécute, il génère un processus qui s'exécute sur la machine hôte. Ce processus contient au moins un thread - le thread principal - dans lequel le programme s'exécute. De plus, Java active le multithreading, ce qui permet aux applications de créer de nouveaux threads qui s'exécutent en parallèle ou de manière asynchrone avec le thread principal.

2.1. Utilisation de Thread.sleep

Un moyen rapide et sale de faire une pause en Java est de dire au thread actuel de se mettre en veille pendant une durée spécifiée. Cela peut être fait en utilisant Thread.sleep (millisecondes) :

try { Thread.sleep(secondsToSleep * 1000); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }

Il est recommandé d'encapsuler la méthode sleep dans un bloc try / catch au cas où un autre thread interrompt le thread endormi. Dans ce cas, nous interceptons l' exception InterruptedException et interrompons explicitement le thread actuel, afin qu'il puisse être intercepté plus tard et géré. C'est plus important dans un programme multi-thread, mais c'est toujours une bonne pratique dans un programme à thread unique au cas où nous ajouterions d'autres threads plus tard.

2.2. Utilisation de TimeUnit.sleep

Pour une meilleure lisibilité, nous pouvons utiliser TimeUnit.XXX.sleep (y) , où XXX est l'unité de temps pour dormir ( SECONDES , MINUTES , etc.), et y est le numéro de cette unité pour dormir. Cela utilise Thread.sleep dans les coulisses. Voici un exemple de la syntaxe TimeUnit :

try { TimeUnit.SECONDS.sleep(secondsToSleep); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }

Cependant, l' utilisation de ces méthodes basées sur les threads présente certains inconvénients :

  • Les temps de sommeil ne sont pas exactement précis, en particulier lors de l'utilisation d'incréments de temps plus petits comme les millisecondes et les nanosecondes
  • Lorsqu'il est utilisé à l'intérieur de boucles, le sommeil dérivera légèrement entre les itérations de boucle en raison de l'exécution d'autres codes, de sorte que le temps d'exécution pourrait devenir imprécis après de nombreuses itérations

3. Une approche basée sur les services exécuteurs

Java fournit l' interface ScheduledExecutorService , qui est une solution plus robuste et précise. Cette interface peut programmer le code pour qu'il s'exécute une fois après un délai spécifié ou à des intervalles de temps fixes.

Pour exécuter un morceau de code une fois après un délai, nous pouvons utiliser la méthode de planification :

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);

La partie Classname :: someTask est l'endroit où nous spécifions la méthode qui s'exécutera après le délai:

  • someTask est le nom de la méthode que nous voulons exécuter
  • Classname est le nom de la classe qui contient la méthode someTask

Pour exécuter une tâche à des intervalles de temps fixes, nous pouvons utiliser la méthode scheduleAtFixedRate :

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);

Cela appellera à plusieurs reprises la méthode someTask , en suspendant pendant delayInSeconds entre chaque appel.

En plus d'autoriser plus d'options de synchronisation, la méthode ScheduledExecutorService donne des intervalles de temps plus précis, car elle évite les problèmes de dérive.

4. Conclusion

Dans cet article, nous avons discuté de deux méthodes pour créer des retards dans les programmes Java.

Le code complet de cet article est disponible sur Github. Il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.