Bloquear proxima tarefa se a anterior ainda estiver rodando

10 respostas
luceliopv

Boa tarde a todos,
estou implementando algo para fazer determinada tarefa no sistema segundo um intervalo de tempo.

Quando meu programa inicia ele lança uma thread que chama essa classe aqui:

public class ThreadMonitorarFTP extends TimerTask {

  String caminho, usuario, senha;
  int executando = 0;
  static Timer timer = new Timer();

  public ThreadMonitorarFTP(String caminho, String usuario, String senha) {
    JOptionPane.showMessageDialog(null, "entrou no construtor...");
    //timer                     //esse delay de 5 seg  a cada 20 segundos
    timer.scheduleAtFixedRate(this, 1000 * 5, 10000 * 2);
  }

  @Override
  public void run() {
    if (executando == 1) {
      //não faz nada
    } else {
      executando = 1; //em execução...
      JOptionPane.showMessageDialog(null, executando + " ##################"); //tarefa que o sistema realizará...
      executando = 0; //fim da execução...
    }
  }
}

Queria que ele funcionasse assim: entra e começa a realizar a tarefa, enquanto realiza a tarefa se o tempo exceder 20 segundos não chamasse novamente a tarefa, ñ executasse nada, mas ele está empilhando as tarefas... Se eu executo e não clico no botão da mensagem é como se a tarefa estivesse em execução, só que depois de clicar no botão ele mostra as outras mensagens das tarefas que teriam que ser executadas pois o tempo excedeu 20 segundos.

Parece que o JOptionPane não tá sendo bloqueante e ele atribui zero a var entrando sempre na msg.

Valeu

10 Respostas

Polimorphism

Esse código ta muito estranho, vc pede 3 argumentos no construtor, mas nem usa. Tenta ajeitar o seu código primeiro.
e Coloque o código inteiro para podermos ajudar mais =)
abraços[]'s

luceliopv

oi, os argumentos são pra serem utilizados na tarefa… Eu simulo a tarefa como sendo o JOptionPane exibindo a mensagem,
Esse é o código inteiro.

Obrigado

P

Coloque “executando” como static.

Só que você pode ter problemas com concorrência. Provavelmente vai precisar transformar executando em algum objeto e usar synchronized. Recomendo você ler sobre Threads e Concorrência.

luceliopv

não deu pozzo, com static dá no mesmo.

P

Seguinte, nem precisa se preocupar com concorrência. Timer ja é Thread-safe. Ele garante para você que apenas um por vez está executando, de forma que você não precisa controlar com a variável “executando”. Entendeu?

Acontece que conforme o tempo vai estourando, ele vai empilhando outras Threads, mas aguarda a que está executando terminar para iniciar a seguinte.

luceliopv

hum, entendi sim pozo,
Mas assim, ñ tem como eu matar essas threads? porque eu não queria que elas ficassem se empilhando, porque essa minha tarefa vai abrir um arquivo, ler o conteudo e realizar alguns calculos.

Muito obrigado

luceliopv

opa, não preciso matar as outras não, a primeira que ler o arquivo vai ler o conteudo e apagá-lo… as outras não conseguirão acessar mais o arquivo mesmo.
valeu

P

Bom, pelo o que você quer, talvez o Timer com repetição a cada determinado tempo não seja a solução. Já que, caso esteja executando, você não quer que execute outro no tempo estipulado.
Tente usar o Timer com apenas uma execução por vez. Recalcule o tempo. Ou simplesmente execute tua tarefa e informe que terminou para iniciar uma próxima, entende. Eu acho que o Timer não é a melhor solução para o que você quer fazer.

luceliopv

entendi,
é que a cada período de tempo eu acesso um ftp e pego esse arquivo tá ligado! Então achei que não tivesse problema pras outras threads pois o arquivo já não vai mais existir.

Vou ver o que faço então.
valeu

luceliopv

pozzo, to usando assim:

public class ThreadMonitorarFTP {

  String caminho, usuario, senha;

  public ThreadMonitorarFTP(String caminho, String usuario, String senha) {
    ActionListener action = new ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
        JOptionPane.showMessageDialog(null, "##################"); //tarefa aqui
      }
    };
    Timer t = new Timer(20000, action);
    t.start();
  }
}

E tá funcionando já
valeu

Criado 15 de setembro de 2009
Ultima resposta 15 de set. de 2009
Respostas 10
Participantes 3