Repetição por tempo

Oi gostaria de implementar em meu algoritmo algo que fizesse repeti-lo a cada 2 horas…
existe uma função especifica pra isso??
o código é esse…


import java.util.Calendar;
import java.util.Random;
import java.util.Scanner;
import java.util.GregorianCalendar;
import javax.swing.*;
public class Projeto_v1 {

	/**
	 * Uma transportadora deseja desenvolver um programa para ser acoplado em
	 * sua frota de caminhões de tal forma que seja possível detectar se o motorista 
	 * está embriagado ou extremamente cansado. A cada duas horas, o motorista 
	 * terá de se submeter a um teste que consiste numa sequência de letras e 
	 * números aleatórios apresentados num monitor. Esses números precisam ser 
	 * imediatamente repetidos no teclado, dentro de um curto intervalo de tempo, 
	 * previamente determinado. Como a atenção de uma pessoa embriagada é 
	 * comprovadamente afetada pelo teor alcoólico ou pela falta de sono, a 
	 * transportadora espera poder detectar quando um motorista está sem condições 
	 * de dirigir e bloquear o caminhão.
	 */
	
	static String palavras [];
	static String palavras_digitadas[];
	static Scanner s = new Scanner (System.in);
	public static void atribuicao(String[] a){

		for(int i = 0;i<a.length;i++){
			switch(i){
			case 0:
				a[i] = "casa";
				break;
			case 1:
				a[i] = "cama";
				break;
			case 2:
				a[i] = "segurança";
				break;
			case 3:
				a[i] = "sono";
				break;
			case 4:
				a[i] = "bebida";
				break;
			case 5:
				a[i] = "acidente";
				break;
			case 6:
				a[i] = "revolução";
				break;
			case 7:
				a[i] = "João";
				break;
			case 8:
				a[i] = "Japão";
				break;
			case 9:
				a[i] = "chaveiro";
				break;
			case 10:
				a[i] = "cerébro";
				break;
			case 11:
				a[i] = "dissociar";
				break;
			case 12:
				a[i] = "definição";
				break;
			case 13:
				a[i] = "importância";
				break;
			case 14:
				a[i] = "critério";
				break;
			case 15:
				a[i] = "ascensorista";
				break;
			case 16:
				a[i] = "excessão";
				break;
			case 17:
				a[i] = "motorista";
				break;
			case 18:
				a[i] = "proposição";
				break;
			case 19:
				a[i] ="ação";
				break;

			}


		}
	}
	public static void impressao(String[]a){
		for(int i =0;i<a.length;i++){
			System.out.println(a[i]);
		}
	}
	public static int verificador_repeticao (int aux, int num_sorteado[]){
		for(int i =0;i<num_sorteado.length;i++){
			if(aux == num_sorteado[i]){
				return -1;// caso o número já foi sorteado retorna -1
			}
		}
		return 0;// caso contrário retorna 0
	}
	public static void digitar(int a[] , String palavra_digitada[]){
		for(int i =0;i<a.length;i++){
			palavra_digitada[i]=JOptionPane.showInputDialog("Digite a palavra: "+palavras[a[i]],"digite aqui");
		}
	}
	public static int comparar(String palavras[], String palavra_digitada[], int a[]){
		int acertos = 0;
		for(int i =0;i<a.length;i++){
			if(palavras[a[i]].equalsIgnoreCase(palavra_digitada[i])){
				acertos++;
			}
		}
		return acertos;
	}
	public static void calculo_tempo(int tempo_inicial[], int tempo_final[], int tempo_gasto[]){
		
		for(int i = 2;i > 0;i--){
			if(tempo_final[i]<tempo_inicial[i]){
				tempo_final[i-1]--;
				tempo_gasto[i] = (tempo_final[i]+60) - tempo_inicial[i];
			}else{
				tempo_gasto[i]= tempo_final[i]-tempo_inicial[i];
			}
		}
		
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GregorianCalendar calendar = new GregorianCalendar();
		int hora = calendar.get(calendar.HOUR_OF_DAY);
		
		GregorianCalendar calendar1 = new GregorianCalendar();
		int hora_inicial = calendar1.get(Calendar.HOUR_OF_DAY);
		int min_inicial = calendar1.get(Calendar.MINUTE);
		int seg_inicial = calendar1.get(Calendar.SECOND);
		int tempo_inicial[ ]= new int [3];
		// colocação do tempo inicial no vetor tempo_inicial
		tempo_inicial [0]= hora_inicial;
		tempo_inicial [1]= min_inicial;
		tempo_inicial [2]= seg_inicial;
		palavras  = new String[20];
		atribuicao(palavras);
		Random random = new Random();
		int num_palavras_digitadas = 5;//quantidade de palavras que a pessoa terá que digitar
		palavras_digitadas = new String [num_palavras_digitadas];
		int num_sorteado[] = new int [num_palavras_digitadas];
		for(int i =0;i<num_palavras_digitadas;i++){
			int aux = random.nextInt(palavras.length);
			// verificar se o numero já foi digitado
			if(verificador_repeticao(aux, num_sorteado)!= 0){
				aux = random.nextInt(palavras.length);
			}
			num_sorteado[i]= aux;//determina a posição do vetor da biblioteca de palavrasque serão digitadas
			
			
		}
		digitar(num_sorteado, palavras_digitadas);
		int acertos = comparar(palavras,palavras_digitadas,num_sorteado);//quantidade de palavras que a pessoa acertou
		int acertos_minimos = 3;
		GregorianCalendar calendar2 = new GregorianCalendar();
		int hora_final = calendar2.get(Calendar.HOUR_OF_DAY);
		int min_final = calendar2.get(Calendar.MINUTE);
		int seg_final = calendar2.get(Calendar.SECOND);
		int tempo_final[]=new int [3];
		// colocação do tempo final no vetor tempo_final
		tempo_final[0]= hora_final;
		tempo_final[1]= min_final;
		tempo_final[2]= seg_final;
		int tempo_gasto [] = new int [3];
		// calculo do tempo gasto;
		calculo_tempo(tempo_inicial, tempo_final, tempo_gasto);
		// colocando o tempo gasto para apenas segundos
		for(int i =0;i<tempo_gasto.length-1;i++){
			if(tempo_gasto[i]>0){
				tempo_gasto[i+1] = tempo_gasto[i+1]+tempo_gasto[i]*60;
			}
		}
		//determinaremos o tempo permitido para digitar as palavras
		int seg_permitido_por_palavra = 5;
		int seg_permitido_total = seg_permitido_por_palavra*num_palavras_digitadas;
		// a comparação será feita apenas pelos segundos por facitar os cálculos
		if(seg_permitido_total >= tempo_gasto[2] && acertos>= acertos_minimos){
			JOptionPane.showMessageDialog(null, "Você está em codições de dirigir.");
			
		}else{
			JOptionPane.showMessageDialog(null, "Você não está em codições de dirigir. \nO caminhão será bloqueado.");
			
		}
		
		
		
		



	}

}

Existe uma API bem completa chamada Quartz que pode fazer isso por você: http://quartz-scheduler.org/documentation/quartz-2.1.x/quick-start

Outra mais simples é o Timer/TimerTask, do próprio Java: http://mballem.wordpress.com/2011/06/01/agendamento-de-tarefas-com-timertask/

não existe um método mais simples? eu não entendi metade disso… =/

Mais simples que TimerTask :arrow: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/TimerTask.html :shock: :?: