Problème avec scheduleAtFixedRate

Résolu
max -  
 max -
Bonjour, j'ai un programme contenant deux class, dont le main est:

package rapport;

import java.util.Timer;
import java.util.TimerTask;

public class Start 
{
    private static Timer clock;
    private static TimerTask myTask;
    public static boolean premierBuild;
        
    public static void main(String[] args){
        
        // Premier nombre = nb de minute entre chaque rapport
        int frequence = 60* (60 * 1000);
        
        premierBuild = true;
        
        clock = new Timer();
        myTask = new Rapport();
        
        clock.scheduleAtFixedRate(myTask,1000,frequence);
    }    
}

Donc en gros, j'appel la class <Rapport> à toute les heures qui va chercher des données sur internets, les interprète et les écrit dans un fichier txt. Dans mon programme j'ai deux sorties, une dans le output de netbeans et l'autre dans le fichier txt.
Voici le output de netbeans qui écrit l'heure à laquelle le rapport a été écrit dans le fichier txt:
------------------------------
2014-11-03 17:07:45.845
2014-11-03 18:07:45.905
2014-11-03 19:07:45.835
2014-11-03 20:07:46.078
2014-11-03 21:07:46.255
2014-11-03 22:07:45.84
2014-11-03 23:07:46.065
2014-11-04 00:07:46.148
2014-11-04 01:07:46.075
2014-11-04 12:09:48.661
2014-11-04 12:09:49.109
2014-11-04 12:09:49.593
2014-11-04 12:09:50.081
2014-11-04 12:09:54.379
2014-11-04 12:09:55.951
2014-11-04 12:09:59.463
2014-11-04 12:10:00.081
2014-11-04 12:10:00.535
2014-11-04 12:10:00.989
2014-11-04 12:10:01.451
2014-11-04 13:07:45.747
2014-11-04 14:07:45.852
2014-11-04 15:07:46.93
--------------------------------

Le problème est qu'à partir de 2014-11-04 12:09:48.661, qui a deux secondes de délai, ma classe Rapport est appelées 11 fois!!!( donc 11 rapports dans le fichier txt). Des fois c'est deux ou trois fois dans l'espace de quelque millisecondes. Il est IMPOSSIBLE que ma classe Rapport puisse faire 11 rapports de suite donc le problème vient de la fonction scheduleAtFixedRate qui appel la classe Rapport 11 fois de suite. Y a t'il des personnes qui ont déjà eu se problème et y a t'il une façon de le réglé. Y a t'il une autre fonction qui fait sensiblement la même chose mais qui est plus fiable.

Merci d'avance de vos réponses.

3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Comme indiqué dans la documentation de Timer, depuis Java 5 pour faire ce genre de tâches il est plus intéressant d'utiliser un ScheduledThreadPoolExecutor, qui s'utilise plus ou moins de la même manière.

En Java 7 :

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println(System.currentTimeMillis());
    }
}, 0, 1, TimeUnit.SECONDS);

En Java 8 :

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(() -> System.out.println(System.currentTimeMillis()), 0, 1, TimeUnit.SECONDS);

La confiance n'exclut pas le contrôle
0
max
 
Et merci, jvais l'essayer et je t'en redonne des nouvelles
0
max
 
Wow, merci, je l'ai essayer sur plusieurs jours et ça marche super bien
0