Esempio di Java Timer TimerTask

Java java.util.Timer è una classe di utilità che può essere utilizzata per pianificare l’esecuzione di un thread in futuro. La classe Java Timer può essere utilizzata per pianificare l’esecuzione di un’attività una sola volta o a intervalli regolari.

Java TimerTask

java.util.TimerTask è una classe astratta che implementa l’interfaccia Runnable e dobbiamo estendere questa classe per creare la nostra TimerTask che può essere pianificata utilizzando la classe java Timer.

Esempio di Timer Java

La classe Timer di Java è thread-safe e più thread possono condividere un singolo oggetto Timer senza necessità di sincronizzazione esterna. La classe Timer utilizza java.util.TaskQueue per aggiungere attività a intervalli regolari e in qualsiasi momento può esserci solo un thread in esecuzione del TimerTask, ad esempio se si crea un Timer per eseguire ogni 10 secondi ma l’esecuzione del singolo thread richiede 20 secondi, allora l’oggetto Timer continuerà ad aggiungere attività alla coda e non appena un thread è finito, notificherà la coda e un altro thread inizierà l’esecuzione. La classe Timer di Java utilizza i metodi Object wait e notify per programmare le attività. Ecco un semplice programma per l’esempio di Java Timer e TimerTask.

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 {
            //supponendo che ci vogliano 20 secondi per completare l'attività
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //esecuzione del timer task come thread daemon
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancellare dopo un po'
        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();
        }
    }

}

Si noti che l’esecuzione del singolo thread richiederà 20 secondi ma l’oggetto Timer di Java è programmato per eseguire l’attività ogni 10 secondi. Ecco l’output del programma:

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

L’output conferma che se un compito è già in esecuzione, il Timer aspetterà che finisca e una volta terminato, inizierà nuovamente il compito successivo dalla coda. L’oggetto Timer di Java può essere creato per eseguire i compiti associati come un thread daemon. Il metodo Timer cancel() viene utilizzato per terminare il timer e eliminare eventuali compiti pianificati, ma non interferisce con il compito attualmente in esecuzione e lo lascia finire. Se il timer viene eseguito come thread daemon, che lo si cancelli o meno, terminerà non appena tutti i thread dell’utente avranno finito di eseguire. La classe Timer contiene diversi metodi schedule() per pianificare un compito da eseguire una volta in una data specifica o dopo un certo ritardo. Ci sono diversi metodi scheduleAtFixedRate() per eseguire periodicamente un compito con un intervallo specifico. Durante la pianificazione dei compiti utilizzando il Timer, è necessario assicurarsi che l’intervallo di tempo sia superiore all’esecuzione normale del thread, altrimenti la dimensione della coda dei compiti continuerà a crescere e alla fine il compito verrà eseguito sempre. Questo è tutto per un breve riepilogo su Java Timer e Java TimerTask.

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