IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

[Thread] Planifier l'exécution de méthodes


Sujet :

avec Java

  1. #1
    Membre régulier Avatar de arkham55
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 179
    Points : 74
    Points
    74
    Par défaut [Thread] Planifier l'exécution de méthodes
    Bonjour à toutes et tous,

    Je viens à vous parce que j'aimerai avoir votre avis sur la question (voir le titre).

    En effet, pour mon programme, j'ai l'utilité de sauvegarder des données toutes les X minutes. Je me suis intéressé aux Thread, mais la classe ne fournit pas d'outils appropriés pour stopper un Thread, et en relançer un autre réinitialisé.
    Je veux dire que les méthodes (stop, suspend, etc) sont dépréciées et les Thread lourds à configurer pour exécuter des méthodes avec intervalles de temps (utilisation de sleep, et encombrement de try/catch).

    Du coup, j'avais (cru) trouver mon bonheur avec la classe Timer, qui fournit des outils pour planifier ce genre de choses. Mais lorsque je testais, les intervalles ne correspondaient pas (schedule), ou n'étaient jamais exécutés (scheduleAtFixedRate)..

    Du coup, j'ai trouvé une autre classe qui permettait l'exécution planifiée et plus précise de méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();    
     
     Runnable task = new Runnable(){      
      @Override
      public void run() {
       try{
          System.out.println(new Date()+" printing");
          if(true)
            throw new RuntimeException();
       }catch (Exception exc) {
          System.out.println(" WARN...task will continiue"+ 
                "running even after an Exception has araised");
        }
      }      
    };
     
    executor.scheduleAtFixedRate(task, 0, 3, TimeUnit.SECONDS);
    Et là, les méthodes sont lancées correctement, a intervalles réguliers, avec prise en compte des ressources (en écriture par exemple). Donc, ma question est : utilisez-vous cette classe également?
    Le fait que schedule de Timer soit ambiguë n'est pas gênant? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay. Subsequent executions take place at approximately regular intervals separated by the specified period
    Ainsi que pour scheduleAtFixedRate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    In fixed-rate execution, each execution is scheduled relative to the scheduled execution time of the initial execution. If an execution is delayed for any reason (such as garbage collection or other background activity), two or more executions will occur in rapid succession to "catch up." In the long run, the frequency of execution will be exactly the reciprocal of the specified period (assuming the system clock underlying Object.wait(long) is accurate).
    Voilà, j'aimerai votre avis.

    Merci
    C'est à ... que vous ... le plus de mystères.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    1) On peut très bien arriver à stopper un Thread en utilisant un flag boolean. Cela dit, la classe Timer est plus facile à manipuler.
    2) la classe Timer fonctionne parfaitement pour une tâche répétitive genre : lire ou écrire quelque chose toutes les 5 minutes.
    perso, je l'utilise depuis des années en milieu industriel pour surveiller des machines et envoyer des comptes-rendus toutes les 10 minutes.
    3) la documentation de la classe ScheduledExecutorService indique que :
    This class is preferable to Timer when multiple worker threads are needed, or when the additional flexibility or capabilities of ThreadPoolExecutor (which this class extends) are required.
    Donc on l'utilise s'il faut échelonner plusieurs tâches indépendantes.
    dans ton cas (sauvegarder des données toutes les X minutes) son utilisation ne semble pas justifiée ; c'est Timer qui est le plus adapté.
    Si tu as conservé le code de ton test avec Timer, on peut certainement y trouver le petit détail qui cloche.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par arkham55 Voir le message
    Le fait que schedule de Timer soit ambiguë n'est pas gênant?

    Ainsi que pour scheduleAtFixedRate :
    Ben si, il existe l'une ou l'autre approche, et l'une des difficultés est de comprendre de laquelle on a besoin. Mais bon, c'est précisément parce qu'on peut avoir besoin de la subtilité de l'une ou de l'autre, que les deux existent.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier Avatar de arkham55
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 179
    Points : 74
    Points
    74
    Par défaut
    Je vous remercie pour vos avis. Il n'y a pas vraiment de solution globale, il faut faire avec les spécificités de chacune de ces méthodes suivant les besoins.

    Je vais te répondre dès demain Népomucène, en te montrant le décalage que j'obtenais. Je te remercie pour ton intérêt sur la question.

    Je m'excuse aussi pour le délai que j'ai laissé coulé entre mon post et cette réponse.

    Bien à vous.
    C'est à ... que vous ... le plus de mystères.

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/01/2011, 17h00
  2. Réponses: 6
    Dernier message: 24/03/2010, 19h36
  3. [C#] Exécuter une méthode apsx.cs depuis un ascx
    Par bendj dans le forum ASP.NET
    Réponses: 12
    Dernier message: 12/07/2005, 11h18
  4. [Thread]Faut-il boucler la méthode run ?
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 17/06/2004, 22h53
  5. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo