1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como gerenciar uma tarefa com estados: iniciar, parar e reiniciar?

Olá, acompanho o fórum já há algum tempo porém somente agora venho a fazer minha primeira pergunta, por que infelizmente garimpei o sagrado Google e não encontrei uma solução, então vamos lá:

Estou desenvolvendo uma aplicação que monitora várias rotas efetuando "ping's" e retornando seus status, portanto o usuário pode iniciar o processo de monitoramento (no caso clicando num botão Iniciar), e parar o mesmo (clicando num botão Parar).

Para isto na classe Monitor, que logicamente realiza o monitoramento, implementei a classe Runnable, e na classe principal Main eu a invoco através de uma Thread. Já tentei utilizar as classes Timer de java.util e TimerTask, porém elas não permitem reiniciar a tarefa agendada. E utilizando a Thread eu também não consigo reiniciar a tarefa. Ou seja, minha aplicação inicia o processo de monitoramento e mantém o loop, mas ao parar eu não consigo inicia-lá novamente.

Segue trechos do código:

Main e eventos dos botões:

//Thread utilizada para gerenciar a tarefa
private Thread clockThread = new Thread(monitor);
//Evento do botão Iniciar
private void jButtonStartActionPerformed(java.awt.event.ActionEvent evt) {                                             
        jButtonStart.setEnabled(false);
        jButtonStop.setEnabled(true);

        clockThread.start();
    }
//Evento do botão Parar
private void jButtonStopActionPerformed(java.awt.event.ActionEvent evt) {                                            
        clockThread.interrupt();

        jButtonStart.setEnabled(true);
        jButtonStop.setEnabled(false);
    }

Classe Monitor

@Override
    public void run() {
        //cria as variáveis que irão armazenar temporariamente alguns dados        
        String status, packetsLoss;
        int index, row = 0;
        byte COUNT = 10;

        try {
            //eu sei que esse while deve estar errado, mas foi a única maneira de executar o loop que pensei
            while (true) {
                //realiza a execução do ping para cada rota na tabela
                for (Routers router : routers) {
                    if (router.isActive()) {

                        //seleciona na tabela a linha da rota que está sendo analisada
                        Main.setSelectedRouter(routers.indexOf(router));

                        //realiza os pings e retorna o resultado
                        status = monitor(router.getIp(), COUNT);

                        //trata o resultado dos pings e devolve diretamente para a tabela
                        if (status.equals("100")) {
                            Main.model.setValueAt("OFF", row, RouterTableModel.AVERAGE_TIME);
                            Main.model.setValueAt(status + "%", row, RouterTableModel.AVERAGE_PACKETS_LOSS);
                        } else {
                            index = status.lastIndexOf("/");
                            packetsLoss = status.substring(index + 1);
                            status = status.substring(0, index);
                            Main.model.setValueAt(status, row, RouterTableModel.AVERAGE_TIME);
                            Main.model.setValueAt(packetsLoss + "%", row, RouterTableModel.AVERAGE_PACKETS_LOSS);                
                        }
                    }

                    //incrementa o índice utilizado pra navegar pela tabela
                    row++;
                }

                Thread.sleep(1000);
                //reseta o índice pois acabou todas as linhas e ele deve iniciar novamente
                row = 0;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Adicionei um while(true) dentro do método run() para manter o loop, pois sem ele apenas era executado uma vez para toda a tabela, porém com ele ao clicar em Parar é gerado um InterruptedException.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags threads ou faça a sua própria pergunta.