3 votes

Exécuter du code Java une fois par heure

J'essaie d'écrire un programme Java simple qui exécute un code toutes les heures lorsque l'aiguille des minutes est à 20. Le problème est que la façon dont je le fais est incroyablement intensive en CPU. Je connais bien Quartz mais je cherche une solution beaucoup plus simple, des idées ?

    boolean run = true;
    while(run){
        Calendar calendar = new GregorianCalendar();
        int minute = calendar.get(Calendar.MINUTE);
        if(minute == 20){
            //Do some Stuff             
        }
    }

5voto

Marko Topolnik Points 77257

Une solution simple consiste à utiliser le cadre des exécuteurs :

final ScheduledExecutorService s = Executors.newSingleThreadScheduledExecutor();
s.scheduleAtFixedRate(task, secondsToFirstOccurence, 60*60, TimeUnit.SECONDS);

Et utiliser un peu de logique pour trouver secondsToFirstOccurence . Cela impliquera probablement un Calendar mais serait beaucoup plus pratique avec JodaTime.

2voto

Óscar López Points 97105

Sachez que si votre application s'exécute dans un environnement géré (un conteneur web ou ejb), vous n'êtes pas autorisé à utiliser la commande Thread.sleep() ou toute autre opération liée aux threads, jetez un coup d'œil à l'outil de gestion des threads. Restrictions EJB page. Je vous mets en garde car la question est étiquetée java-ee Si elle est exécutée dans un conteneur Java EE, il faut tenir compte de considérations supplémentaires.

Si vous créez une application d'entreprise, oubliez le concept de Thread.sleep() . Choisissez un planificateur de tâches à part entière. Quartz Il s'agit d'un produit open source, extrêmement mature et fiable. Ou utilisez Planificateur d'Obsidian un planificateur commercial riche en fonctionnalités, avec plus de fonctionnalités prêtes à l'emploi que Quartz.

Une alternative légère à un planificateur complet (mais adaptée à l'exécution dans un conteneur) serait d'utiliser la fonction Service de minuterie .

1voto

amit Points 74385

Vous recherchez peut-être Thread.sleep() entre les appels

1voto

Olaf Dietsche Points 35264

Regardez java.util.Timer méthode scheduleAtFixedRate().

1voto

Radu Points 454

Je vous suggère de supprimer la logique d'ordonnancement de votre programme java.
En procédant ainsi, vous pouvez vous concentrer uniquement sur ce que vous voulez que votre programme fasse et laisser la partie programmation au système d'exploitation.
De plus, si par exemple vous décidez à un moment donné d'écrire un programme c++ qui fait ce que votre code java sait faire, vous n'aurez pas à implémenter la logique cron dans votre nouveau programme.

Ceci étant dit :

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