Executar método de 10 em 10 minutos

Ola Pessoal,

Gostaria de saber como eu posso fazer um método que seja executado por exemplo, de 10 em 10 minutos? A única solução é utilizar threads, ou existe uma outra???

Obrigado…

[]s

Wagner

A única solução eh thread sim

while (true) { metodo(); Thread.sleep(10*60*1000); }

Ola,

Obrigado pela ajuda!

[]s

Wagner

Depende… não necessariamente vc deve usar só Thread…
Vc pode usar a classe Timer

Ex:

/** Timer de verificação do status. */
private javax.swing.Timer tmrStatus;

// timer de verificação da comuniação
tmrStatus = new Timer(TIMER_VERIFICA_CONEXAO, new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
//método a ser executado
verificaConexao(evt);
}
});

onde TIMER_VERIFICA_CONEXAO é o tempo em ms de acionamento do timer.

// inicio o timer
tmrStatus.start();

/* Método a ser executado a cada x ms
*/
private void verificaConexao(java.awt.event.ActionEvent evt) {
//coloque aki a sua lógica
}
[/img]

[quote=“viecili”]A única solução eh thread sim

while (true) { metodo(); Thread.sleep(10*60*1000); }[/quote]

uma solução em uma unica thread não é uma boa solução pois impede o programa de fazer outras coisas

e um conselho, não use thread.sleep qndo se quer parar por uma quantidade exata de tempo. use um while que compara o tempo decorrido

int TIMEOUT = 10 * 60 * 1000; 
/*10 min, tem 60 seg, 1 seg tem 1000 miles.
logo, 10 min tem 600.000 milesimos*/
date d = new Date();
while((new Date().getTime() - d.getTime()) < TIMEOUT)
  metodo();

Ola Pessoal,

Mais uma vez obrigado pelas dicas, mas estou com uma outra dúvida.

Por exemplo, eu executo um processo, e solicito que execute esse método que será executado de 10 em 10 minutos. Esse processo fica executando… vamos chamar de processo1, e um outro processo (processo2) solicita a esse metodo (10 em 10 minutos) que fique executando tb. Como que eu posso tratar esse exemplo de vários processos sendo executados e retornando parâmetros diferentes. Não sei se eu estou certo, mas o uso de threads é justamente para ter vários processos sendo executandos ao mesmo tempo, é isso? E se terminar o processo1 como que eu mando “matar” a execução do método???

[]s

Wagner

[quote=“microfilo”][quote=“viecili”]A única solução eh thread sim

while (true) { metodo(); Thread.sleep(10*60*1000); }[/quote]

uma solução em uma unica thread não é uma boa solução pois impede o programa de fazer outras coisas

e um conselho, não use thread.sleep qndo se quer parar por uma quantidade exata de tempo. use um while que compara o tempo decorrido

int TIMEOUT = 10 * 60 * 1000; /*10 min, tem 60 seg, 1 seg tem 1000 miles. logo, 10 min tem 600.000 milesimos*/ date d = new Date(); while((new Date().getTime() - d.getTime()) < TIMEOUT) metodo(); [/quote]

no seu ex vc esqueceu do ; depois do while… desse jeito vai ficar executando o metodo direto por 10 minutos…

e tipo, usando Thread.sleep vc n consome recursos do processador, se vc manter em um loop vc vai deixar o computador MUITO lento…
para resolver o problema do Thread.sleep nao ser preciso, vc pode somar o tempo ao valor antigo…

public void loop(){
 final int TIMEOUT = 600000;
 (new Thread(){
  public void run(){
   int fim =  System.currentTimeMillis();
   while (true){
    fim += TIMEOUT;
    try{
     Thread.sleep(fim - System.currentTimeMillis());
    }
    catch (Exception erro){}
    Classe.metodo(); // assumindo q o metodo eh estatico
   }
  }
 }).start();
}

desse jeito nao vai deixar o pc lento… e como ta sempre acrescentando o TIMEOUT, pode ateh n ser extato algumas vezes, mas dai nao vai ficar “acumulando” a diferenca…

[quote=“java_duvidas”]
Por exemplo, eu executo um processo, e solicito que execute esse método que será executado de 10 em 10 minutos. Esse processo fica executando… vamos chamar de processo1, e um outro processo (processo2) solicita a esse metodo (10 em 10 minutos) que fique executando tb. Como que eu posso tratar esse exemplo de vários processos sendo executados e retornando parâmetros diferentes. Não sei se eu estou certo, mas o uso de threads é justamente para ter vários processos sendo executandos ao mesmo tempo, é isso? E se terminar o processo1 como que eu mando “matar” a execução do método???[/quote]

Esta sua idéia está muito confusa, vc parece estar confundindo método com processo… só sei q não captei o q vc está querendo.
Mas vou te dar um exemplo bem simples de uso de Threads e monitores (se quiser saber mais sobre monitores e Threads dê uma olhada no Livro do Deitel&Deitel 3ªed - mto bom!)

Classe Monitor

[code]public class Monitor {
private boolean parar = false;
public synchronized int dobrarValor(int valor) {
valor = valor << 1;
this.parar = valor > 1000;
return valor;
}

public boolean parar() {
return parar;
}
}[/code]

Classe Processo

[code]public class Processo extends Thread {
private Monitor monitor;
private int base;
public Processo(Monitor monitor, int base) {
this.monitor = monitor;
this.base = base;
}

void run() {
while(!monitor.parar())
base = monitor.dobraValor(base);
sleep(3000);
}
System.out.println("parou! final = "+base);
}
}[/code]

Classe Main

[code]public class Main {
public static void main(String[] args) {
Monitor monitor = new Monitor();

Thread p1 = new Processo&#40;monitor,1&#41;;
Thread p2 = new Processo&#40;monitor,2&#41;;
Thread p3 = new Processo&#40;monitor,10&#41;;

p1.start&#40;&#41;;
p2.start&#40;&#41;;
p3.start&#40;&#41;;

}
}[/code]

Veja que é um exemplo puramente didático para mostrar como um método pode ser acessado de modo concorrente por vários processos. Nesta situação existe uma classe Monitor (conceito de monitor) que provê o método dobraValor(), uma instância desta classe é passada para os processos que irão executar o método de 3 em 3 segundos. O acesso ao método é sincronizado, ou seja, dois processos nunca estarão executando o método ao mesmo tempo. Os processos somente param sua execução quando o dobro de um valor (de qualquer processo) superar 1000.

Embora o código seja simples, os conceitos envolvidos requerem um certo entendimento prévio de programação paralela, monitores/semáforos etc… A programação com Threads é bastante poderosa, mas causa uma boa dor de cabeça pra manter a consistência dos dados envolvidos e do acesso aos métodos.

Outra coisa Wagner, por favor, não caia nessa de fazer loop comparando valor do tempo corrente do sistema, seja elegante, não escove os bits… dê a eles um banho de loja!! :wink:

Qualquer coisa pode perguntar…

[quote=“Felipe”]
e tipo, usando Thread.sleep vc n consome recursos do processador, se vc manter em um loop vc vai deixar o computador MUITO lento…
para resolver o problema do Thread.sleep nao ser preciso, vc pode somar o tempo ao valor antigo…

public void loop&#40;&#41;&#123;
 final int TIMEOUT = 600000;
 &#40;new Thread&#40;&#41;&#123;
  public void run&#40;&#41;&#123;
   int fim =  System.currentTimeMillis&#40;&#41;;
   while &#40;true&#41;&#123;
    fim += TIMEOUT;
    try&#123;
     Thread.sleep&#40;fim - System.currentTimeMillis&#40;&#41;&#41;;
    &#125;
    catch &#40;Exception erro&#41;&#123;&#125;
    Classe.metodo&#40;&#41;; // assumindo q o metodo eh estatico
   &#125;
  &#125;
 &#125;&#41;.start&#40;&#41;;
&#125;

desse jeito nao vai deixar o pc lento… e como ta sempre acrescentando o TIMEOUT, pode ateh n ser extato algumas vezes, mas dai nao vai ficar “acumulando” a diferenca…[/quote]

mesmo assim há probabilidade de imprecisão
se o timeout for pequeno e cada execução deve impreterivelmente ser executada na frequencia determinada, Thread.sleep não é muito recomemdado

eu esqueci mesmo do ;…

mas tipo, eh melhor nao ficar perfeitamente preciso do q deixar o computador extremamente lento…

qquer coisa, eh soh usar um tempo menor e nos ultimos milisegundos ai sim fazer do seu jeito, mas agora ficar frocando direto eh dar uma facada no desempenho…

e o preço que se paga pra ter uma coisa com precisão nanometrica :razz: