Exemplo de Java Timer TimerTask

Java java.util.Timer é uma classe de utilidade 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 esta 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 java.util.TaskQueue para adicionar tarefas em intervalos regulares especificados, e a qualquer momento pode haver apenas uma thread executando a TimerTask. Por exemplo, se você estiver criando um Timer para ser executado a cada 10 segundos, mas a execução de uma única thread levar 20 segundos, o objeto Timer continuará adicionando tarefas à fila e assim que uma thread terminar, notificará a fila e outra thread começará a executar. A classe Java Timer utiliza os métodos wait e notify da classe Object para agendar as tarefas. Aqui está um programa simples de exemplo usando 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 {
            // supondo que a tarefa leve 20 segundos para ser concluída
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        // executando a tarefa do timer 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 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

A saída confirma que, se uma tarefa já estiver sendo executada, o Timer aguardará sua conclusão e, uma vez concluída, iniciará novamente a próxima tarefa da fila. O objeto Java Timer pode ser criado para executar as tarefas associadas como uma thread de daemon. O método Timer cancel() é usado para encerrar o temporizador e descartar qualquer tarefa agendada, no entanto, não interfere na tarefa em execução no momento e permite que ela seja concluída. Se o temporizador estiver sendo 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 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 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