Exemple de minuterie Java TimerTask

Java java.util.Timer est une classe utilitaire qui peut être utilisée pour planifier l’exécution d’un thread à un certain moment dans le futur. La classe Java Timer peut être utilisée pour planifier une tâche à exécuter une seule fois ou à exécuter à intervalles réguliers.

Java TimerTask

java.util.TimerTask est une classe abstraite qui implémente l’interface Runnable et nous devons étendre cette classe pour créer notre propre TimerTask qui peut être planifié en utilisant la classe java Timer.

Exemple de Timer Java

La classe Timer de Java est thread-safe et plusieurs threads peuvent partager un seul objet Timer sans nécessiter de synchronisation externe. La classe Timer utilise java.util.TaskQueue pour ajouter des tâches à intervalles réguliers et à tout moment, il ne peut y avoir qu’un seul thread en cours d’exécution pour TimerTask. Par exemple, si vous créez un Timer pour s’exécuter toutes les 10 secondes mais que l’exécution d’un thread unique prend 20 secondes, l’objet Timer continuera d’ajouter des tâches à la file d’attente et dès qu’un thread est terminé, il notifiera la file d’attente et un autre thread commencera à s’exécuter. La classe Timer de Java utilise les méthodes wait et notify de l’objet pour planifier les tâches. Voici un exemple simple de programme pour Timer et TimerTask en Java.

package com.journaldev.threads;

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

public class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        System.out.println("Timer task started at:"+new Date());
        completeTask();
        System.out.println("Timer task finished at:"+new Date());
    }

    private void completeTask() {
        try {
            //en supposant que cela prend 20 secondes pour terminer la tâche
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //exécution de la tâche du timer en tant que thread daemon
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //annulation après un certain temps
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
        System.out.println("TimerTask cancelled");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

Remarquez qu’une exécution de thread prendra 20 secondes, mais l’objet Timer de Java est programmé pour exécuter la tâche toutes les 10 secondes. Voici le résultat du programme:

TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012

La sortie confirme que si une tâche est déjà en cours d’exécution, Timer attendra qu’elle se termine et une fois terminée, il démarrera à nouveau la prochaine tâche de la file d’attente. L’objet Timer Java peut être créé pour exécuter les tâches associées en tant que thread démon. La méthode Timer cancel() est utilisée pour terminer le minuteur et abandonner toutes les tâches programmées, cependant elle n’interfère pas avec la tâche en cours d’exécution et la laisse se terminer. Si le minuteur est exécuté en tant que thread démon, que nous l’annulions ou non, il se terminera dès que tous les threads utilisateur auront fini leur exécution. La classe Timer contient plusieurs méthodes schedule() pour programmer une tâche à exécuter une fois à une date donnée ou après un certain délai. Il existe plusieurs méthodes scheduleAtFixedRate() pour exécuter une tâche périodiquement avec un certain intervalle. Lors de la planification de tâches à l’aide de Timer, vous devez vous assurer que l’intervalle de temps est supérieur à l’exécution normale du thread, sinon la taille de la file d’attente des tâches continuera de croître et finira par être toujours en cours d’exécution. C’est tout pour un bref survol de Java Timer et Java TimerTask.

Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example