Você está na página 1de 4

Programando com Java Artigo http://mballem.wordpress.

com/

Agendamento De Tarefas Com TimerTask


Autor Marcio Ballem: formado em Sistemas de Informao e possui certificao Oracle Certified Professional, Java SE 6 Programmer. Trabalhou profissionalmente com desenvolvimento em Delphi 7 e Java JEE.
Introduo O agendamento de tarefas permite que se tenha rotinas em nosso sistema que sejam executadas em um determinado dia, horrio ou mesmo em pequenos intervalos de tempo. Neste tutorial veremos como usar as bibliotecas TimerTask e Timer, presentes no JDK desde a verso 1.3 do Java.

1. Tipos de Agendamento Peridico: quando uma tarefa executada diversas vezes em um pequeno ou grande intervalo de tempo. Execuo nica (one-shot): quando temos uma ao executada uma nica vez ao dia ou em um horrio pr-definido uma nica vez.

2. Classes Envolvidas java.util.TimerTask: ir representar a tarefa a ser agendada. uma classe abstrata que implementa a interface Runnable, assim, devemos criar uma sub-classe que implemente o mtodo run(). java.util.Timer: ir representar o agendado de tarefas atravs de uma Thread.

3. Implementao Vamos comear criando uma classe chamada Agendamentos que ir possuir os mtodos de agendamento e um mtodo main. Tambm teremos uma classe chamada Execucoes que ter o mtodo que ser executado pelos agendamentos.
Listagem 1. Classe Agendamentos

package br.mb.tutorialTimerTask; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class Agendamentos { private static int count = 0; public static void main(String[] args) { Agendamentos a = new Agendamentos();

a.primeiraTarefa(); } private void primeiraTarefa() { final Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { System.out.println("Counting " + (++count) + " Time: " + new Date() ); new Execucoes().tabuada(count); if (count == 5) { t.cancel(); } } }, 5000, 3000); } }

Listagem 2. Classe Execucoes

package br.mb.tutorialTimerTask; public class Execucoes { public void tabuada(int valor) { for (int i = 1; i < 11; i++) { System.out.println(i + " * " + valor + " = " + (i * valor)); } } } Na listagem 2, foi criado um mtodo chamado tabuada que recebe como parmetro um valor inteiro. Este mtodo quando executado exibe a tabuada do parmetro. Na listagem 1, temos um mtodo chamado primeiraTarefa que nossa tarefa agendada. Quando este mtodo for executado, aps 5 segundos ele ir iniciar a tarefa, ou seja, executar o mtodo tabuada e aps 3 segundos, executar novamente at o contador count for igual a 5. Quando o contador for 5, iremos cancelar a tarefa atravs do mtodo cancel() da classe Timer. No mtodo primeiraTarefa criamos um objeto do tipo Timer e em seguida fazemos uma chamada ao mtodo schedule() deste objeto. Este mtodo recebeu como 1 parmetro uma classe annima da do tipo TimerTask. O 2 parmetro representa o tempo em milissegundos que levar para a tarefa ser executada pela primeira vez e o 3 parmetro representa o intervalo de tempo entre cada execuo da tarefa. Como dito na sesso 2, a classe TimerTask deve implementar o mtodo run(), e nele que a tarefa a ser executada deve ser informada. Essa foi uma tarefa do tipo peridica.

Na listagem 3, vamos criar um mtodo que ser executado em um dia definido no cdigo, assim, teremos uma execuo de tarefa do tipo Execuo nica. Ajuste a data para o dia em que voc est estudando este tutorial, para que a execuo ocorra.

Listagem 3. Mtodo segundaTarefa

public class Agendamentos { private void segundaTarefa() { Calendar data = Calendar.getInstance(); //2011 ano //4 ms (janeiro equivale a 0, fevereiro a 1, ..., dezembro a 11) //30 - dia data.set(2011, 4, 30); final Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { System.out.println("Counting " + (++count) + " Time: " + new Date() ); new Execucoes().tabuada(count); t.cancel(); } }, data.getTime() ); }}

Na listagem 4, vamos criar um mtodo que ser executado em um horrio pr-definido, assim, teremos uma execuo de tarefa do tipo Peridica.
Listagem 4. Mtodo terceiraTarefa

public class Agendamentos { private void terceiraTarefa() { Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR_OF_DAY, 18); c.set(Calendar.MINUTE, 22); c.set(Calendar.SECOND, 0); Date time = c.getTime(); final Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { System.out.println("Counting " + (++count) + " Time: " + new Date() ); new Execucoes().tabuada(count); t.cancel(); } }, time ); } } A hora definida no exemplo foi 18:22:00. Ajuste a sua vontade, pode colocar um ou dois minutos aps a hora marcada no relgio do seu sistema operacional para executar o teste.

Referncias

Documentao da classe java.util.Timer


http://download.oracle.com/javase/6/docs/api/index.html?java/util/Timer.html

Documentao da classe Java.util.TimerTask


http://download.oracle.com/javase/6/docs/api/index.html?java/util/TimerTask.html