Exemplo de Java Timer TimerTask

Java java.util.Timer é uma classe utilitária que pode ser usada para agendar uma thread para ser executada em um determinado momento no futuro. A classe Java Timer pode ser usada para agendar uma tarefa para ser executada uma vez ou em intervalos regulares.

Java TimerTask

java.util.TimerTask é uma classe abstrata que implementa a interface Runnable e precisamos estender essa classe para criar nossa própria TimerTask que pode ser agendada usando a classe java Timer.

Exemplo de Java Timer

A classe Java Timer é segura para threads e múltiplas threads podem compartilhar um único objeto Timer sem a necessidade de sincronização externa. A classe Timer utiliza a java.util.TaskQueue para adicionar tarefas em intervalos regulares e em qualquer momento pode haver apenas uma thread executando a TimerTask, por exemplo, se você estiver criando um Timer para rodar a cada 10 segundos, mas a execução de uma única thread leva 20 segundos, então o objeto Timer continuará adicionando tarefas à fila e assim que uma thread terminar, ele notificará a fila e outra thread começará a executar. A classe Java Timer utiliza os métodos wait e notify do objeto para agendar as tarefas. Aqui está um programa simples para o exemplo de 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 {
            //assumindo que leva 20 segundos para concluir a tarefa
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //executando a tarefa do temporizador como uma thread daemon
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancelar após algum tempo
        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();
        }
    }

}

Observe que a execução de uma única thread levará 20 segundos, mas o objeto Timer do Java está agendado para executar a tarefa a cada 10 segundos. Aqui está a saída do programa:

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

O resultado confirma que se uma tarefa já está em execução, o Timer aguardará sua conclusão e, uma vez finalizada, iniciará novamente a próxima tarefa da fila. O objeto Timer em Java pode ser criado para executar as tarefas associadas como uma thread de daemon. O método Timer cancel() é utilizado para encerrar o temporizador e descartar quaisquer tarefas agendadas, no entanto, não interfere na tarefa em execução no momento, permitindo que ela seja concluída. Se o temporizador é executado como uma thread de daemon, seja cancelado ou não, ele será encerrado assim que todas as threads do usuário terminarem a execução. A classe Timer contém vários métodos schedule() para agendar uma tarefa para ser executada uma vez em uma determinada data ou após algum atraso. Existem também vários métodos scheduleAtFixedRate() para executar uma tarefa periodicamente com um intervalo específico. Ao agendar tarefas usando o Timer, certifique-se de que o intervalo de tempo seja maior do que a execução normal da thread, caso contrário, o tamanho da fila de tarefas continuará aumentando e, eventualmente, a tarefa será executada continuamente. Isso resume rapidamente o Java Timer e Java TimerTask.

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