Como testar a duração de uma thread?

3 respostas
arthurthiago

Olá galera!

Estou tendo uma pequena dificuldade em um assunto específico à Threads: não consigo testar se uma thread está extrapolando determinado tempo. Estou implementando este código para descobrir se a Thread está demorando demais para executar, caso isto ocorra, quero finalizar esta thread. No momento estou usando este método:

Neste método quero testar se o outputGobbler ainda está em execução depois de determinado tempo.

private void testarTravamento() { travou = false; new Thread(new Runnable() { public void run() { try { Thread.currentThread().sleep(Constantes.getTempoMaximoExecucao()); } catch (InterruptedException e) { e.printStackTrace(); } if (outputGobbler.isAlive()) { travou = true; proc.destroy(); String processo = args[2].substring(0, args[2].length() - 4); String[] argsD = new String[] { "cmd", "/C", "tskill", processo}; Executador exec = new Executador(diretorio, argsD, null); exec.executar(); } } }).start(); }

Porém não está funcionando! Creio que me confundi em algo.

Espero uma luz dos meus queridos amigos do GUJ!

Um grande abraço!

3 Respostas

renzonuccitelli

Não era mais fácil vc, ao início do método run da Thead que vc deseja medir, pegar o tempo com a classe System e ao final do mesmo ver quanto tempo passou?

renzonuccitelli

Veja esse tópico, talvez ele te ajude.

arthurthiago

Na verdade neste programa eu não quero saber quanto tempo a Thread dura em todos os casos, quero apenas pará-la se ela extrapolar determinado tempo.

Por exemplo: Inicio a Thread, e fico testando se ela extrapolou 5s de execução, caso extrapolou eu encerro ela e faço um tratamento de erro.

Eu utilizava o código a seguir antes e funciona corretamente, porém a implementação não era nada otimizada:

outputGobbler = new StreamGobbler(proc.getInputStream(), "SAÍDA");

long tempoInicial = System.currentTimeMillis();

while (outputGobbler.isAlive()) {
    Thread.currentThread().sleep(1000);
    if (System.currentTimeMillis() - tempoInicial >
            Constantes.getTempoMaximoExecucao()) {
        proc.destroy();
        String processo = args[2].substring(0, args[2].length() - 4);
        String[] argsD = new String[] { "cmd", "/C", "tskill", processo};
        Executador exec = new Executador(diretorio, argsD, null);
        exec.executar();
    }
}

Funciona, porém o sistema fica muito lento! Pois precisa esperar os 1s que coloquei, poderia diminuir este tempo, porém queria um jeito de fazer colocando uma outra thread pra dormir por 5s por exemplo e depois essa thread testa se a outra ainda está viva, ou de alguma outra forma para fazer essa contagem sem consumir totalmente a CPU, que é o caso do while (outputGobbler.isAlive()) {}

Caso tenha ficado confuso a minha explicação é só falar!

Desde já agradeço pela ajuda!

Abração!

Criado 19 de dezembro de 2008
Ultima resposta 20 de dez. de 2008
Respostas 3
Participantes 2