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

shedule tasks timer java

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 timer
Oracle: classe timerTask
java2s:Toolkit beep
javapoint: daemon thread