Como limitar o tempo de execução de uma Thread?

4 respostas
arthurthiago

Fala galera!

Me deparei com uma situação que preciso contornar: Preciso definir um tempo máximo de execução de uma determinada Thread, caso depois deste tempo ela continue rodando quero interrompe-la e fazer alguns tratamentos de erro.

Eu implementei um código que funciona, porém é demasiadamente não otimizado! Como está mostrado abaixo:

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

            long tempoInicial = System.currentTimeMillis();
            outputGobbler.start();

            while (outputGobbler.isAlive()) {
                Thread.currentThread().sleep(1000);
                if (System.currentTimeMillis() - tempoInicial >
                        Constantes.getTempoMaximoExecucao()) {
                    TRATAMENTO
                }
            }

StreamGobbler é uma classe que extende Thread.

Existe uma forma de colocar uma outra Thread para "dormir" por este tempo máximo e quando ela acordar ela testar se a outra thread está ativa e caso esteja, encerrá-la e fazer um tratamento de erro?

Isto é possível?

Desde já agradeço! Um grande abraço!

4 Respostas

keller

Talvez uma solucao seria criar uma outra Thread e coloca-la pra sleep/wait pelo tempo maximo determinado
e quando ela voltar a execucao faria o tratamento necessario caso a outra Thread ainda estiver em execucao.

Ou to falando besteira? :slight_smile:

P

Tenho dois links, que podem ser úteis:

http://www.acme.com/resources/classes/Acme/TimeKiller.java

http://articles.techrepublic.com.com/5100-10878_11-5144546.html

sergiotaborda
arthurthiago:
Fala galera!

Me deparei com uma situação que preciso contornar: Preciso definir um tempo máximo de execução de uma determinada Thread, caso depois deste tempo ela continue rodando quero interrompe-la e fazer alguns tratamentos de erro.

Eu implementei um código que funciona, porém é demasiadamente não otimizado! Como está mostrado abaixo:

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

            long tempoInicial = System.currentTimeMillis();
            outputGobbler.start();

            while (outputGobbler.isAlive()) {
                Thread.currentThread().sleep(1000);
                if (System.currentTimeMillis() - tempoInicial >
                        Constantes.getTempoMaximoExecucao()) {
                    TRATAMENTO
                }
            }

StreamGobbler é uma classe que extende Thread.

Existe uma forma de colocar uma outra Thread para "dormir" por este tempo máximo e quando ela acordar ela testar se a outra thread está ativa e caso esteja, encerrá-la e fazer um tratamento de erro?

Isto é possível?

É possivel mas é estranho. Básciamente vc quer criar um timeout para a execução da thread. isso é estranho.

Primeiro, não faça seus objetos estender Thread. Isso é coisa perigosa. Faça-os estender Runnable.

Agora, o que queremos é dar um ponto final no runnable. Então precisamos de um timer. Após um certo tempo o timer activa um evento que é chamado no runnable. Ai o runnable terá que fazer tudo o possivel para completar a tarefa naquele momento ou interrompê-la.

Use Timer e Timertask para o cornometro. Cria um classe que implementa a interface a seguir :

interfaca InterruptaleRunnable implements Runnable{

   public void interrupt();
}

Se o interrupt for simplesmente interromper a threa corrente ( o que é perigoso) vc pode implementar a logica em cima de thread já que ela possui um interrupt(). Mas faça isso por sua conta e risco. Mexer diretamente com thread é perigoso ( a mesmo que vc saiba o que está fazendo, claro )

Leandro_Vecchi

não daria para criar um timer e quando chegasse no tempo que você quisese ele terminaria a thread?

Criado 21 de dezembro de 2008
Ultima resposta 22 de dez. de 2008
Respostas 4
Participantes 5