Synchroniser les threads java avec timer et timerTask
java.util.timer est une classe qui peut être utilisée pour ordonnancer (java scheduler) les tâches associées à un thread pour une exécution dans le futur. Les taches peuvent s’exécuter une seule fois ou en répétition à intervalles réguliers.
De multiples threads peuvent partager entre eux une seule instance de
timer à condition qu'il y'aura une synchronisation de threads java.
java.util.TimerTask est une classe abstraite qui implémente l'interface
Runnable. On doit hériter de cette classe pour créer notre
TimerTask qui va être ordonnancé en utilisant la classe
timer. La classe
timer utilise les méthodes
wait et notify pour ordonnancer les processus.
Voici un exemple de l'implémentation de timer:
import java.awt.Toolkit;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTache{
static Toolkit toolkit;
public TimerTache(){
toolkit = Toolkit.getDefaultToolkit();
TimerTask timerTask = new executetache();
//executer le timertask comme un thread deamon
Timer timer = new Timer(true);
//shedule la tache pour une futur execution dans un temps prédifini
timer.schedule(timerTask, 0, 1*1000);
System.out.println("TimerTask démaré");
//annuler après un certain temps de 10s
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask arreté");
}
class executetache extends TimerTask {
@Override
public void run() {
System.out.println("Commence : "+new Date());
try {
//2 secondes pour accomplir la tache
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
toolkit.beep();
System.out.println("Finit : "+new Date());
}
}
public static void main(String args[]){
new TimerTache();
}
}
Sortie
Cela est un exemple simple d'un gestionnaire de tâches. Timer va lancer une tâche chaque 1 seconde(1000 millisecondes) de façon répétitive et un intervalle fixe avec la méthode schedule() qui prend comme arguments:
- La tâche à ordonnancer.
- Le Temps avant que la tâche serait exécutée en millisecondes.
- Le Temps entre les exécutions successives des tâches ou la fréquence d’exécution en millisecondes.
Les résultats de la compilation de ce programme montrent que timer attend que le processus en cours d’exécution termine pour qu'il puisse passer au suivant dans la queue.
La méthode
Timer.cancel() annule le timer et toutes les tâches dans la file d'attente. Une fois que c'est fait, son thread daemon est aussi arrêté.
Références:
Oracle: Classe timerOracle: classe timerTaskjava2s:Toolkit beepjavapoint: daemon thread