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 :
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? :
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 :
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
Partager