web-dev-qa-db-fra.com

Faire un fil pour dormir pendant 30 minutes

Je veux que mon fil attende 30 minutes. Y a-t-il des problèmes à le faire?

15
venkata lokesh

Vous pouvez faire dormir votre fil pendant 30 minutes comme ceci:

Thread.sleep(30 *   // minutes to sleep
             60 *   // seconds to a minute
             1000); // milliseconds to a second

En utilisant Thread.sleep n'est pas intrinsèquement mauvais. Expliqué simplement, il indique simplement au planificateur de threads de préempter le thread. Thread.sleep est mauvais lorsqu'il est mal utilisé.

  • Dormir sans libérer de ressources (partagées) : si votre thread est en veille avec une connexion de base de données ouverte à partir d'un pool de connexions partagées ou un grand nombre d'objets référencés dans mémoire, les autres threads ne peuvent pas utiliser ces ressources. Ces ressources sont gaspillées tant que le thread est en veille.
  • Utilisé pour éviter conditions de concurrence: Parfois, vous pouvez pratiquement résoudre une condition de concurrence en introduisant un sleep. Mais ce n'est pas un moyen garanti. Utilisez un mutex. Voir Y a-t-il un Mutex en Java?
  • En tant que minuterie garantie : Le temps de sommeil de Thread.sleep n'est pas garanti. Il pourrait retourner prématurément avec un InterruptedException. Ou il pourrait trop dormir.

    De documentation :

    public static void sleep(long millis) throws InterruptedException
    

    Fait dormir le thread en cours d'exécution (arrête temporairement l'exécution) pendant le nombre de millisecondes spécifié, sous réserve de la précision et de l'exactitude des temporisateurs et des planificateurs du système.


Vous pouvez également utiliser, comme kozla1 l'a montré dans leur commentaire:

TimeUnit.MINUTES.sleep(30);
32
sampathsris

La réponse de Krumia montre déjà parfaitement comment dormir un Thread en cours d'exécution. Parfois, l'exigence de mettre en veille ou de suspendre un thread provient du souhait d'effectuer une opération à une date ultérieure. Si tel est le cas, il vaut mieux utiliser un concept de niveau supérieur comme Timer ou ScheduledExecutorService:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(operation, 30, TimeUnit.MINUTES);

operation est le Runnable que vous souhaitez exécuter en 30 minutes.

En utilisant un ScheduledExecutorService, vous pouvez également exécuter périodiquement des opérations:

// start in 10 minutes to run the operation every 30 minutes
executor.scheduleAtFixedDelay(operation, 10, 30, TimeUnit.MINUTES);
4
isnot2bad