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

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:

[code]
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
            }
        }[/code]

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!

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:

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

[quote=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:

[code]
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
            }
        }[/code]

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?
[/quote]

É 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 :

[code]interfaca InterruptaleRunnable implements Runnable{

public void interrupt();
}[/code]

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 )

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