Problème avec scheduleAtFixedRate
Résolu
max
-
max -
max -
Bonjour, j'ai un programme contenant deux class, dont le main est:
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:
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.
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
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 :
En Java 8 :
La confiance n'exclut pas le contrôle
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