Olá pessoal,
Sou novo no assunto e tenho uma dúvida: com faço para limitar o tempo de execução de uma thread? Por exemplo, uma thread deve executar por no máximo 10 segundos. Qualquer ajuda, agradeço desde já.
Olá pessoal,
Sou novo no assunto e tenho uma dúvida: com faço para limitar o tempo de execução de uma thread? Por exemplo, uma thread deve executar por no máximo 10 segundos. Qualquer ajuda, agradeço desde já.
neste post do meu blog tem uma solução para Threads limitadas por tempo 
http://www.urubatan.com.br/2006/09/29/estou-me-apaixonando-pelo-javautilconcurrent/
Thread.sleep(2000); //exemplo com 2s de duração
Obrigado pela ajuda galera.
Thread.sleep(2000); //exemplo com 2s de duração
Olá pessoal,Sou novo no assunto e tenho uma dúvida: com faço para limitar o tempo de execução de uma thread? Por exemplo, uma thread deve executar por no máximo 10 segundos. Qualquer ajuda, agradeço desde já.
Uma coisa importante que vc. deve ter em bem claro:
Um thread só pode ser interrompido de forma “colaborativa”, ou seja, se chamar em algum momento o método interrupted() ou chamar alguma rotina que lance um “InterruptedException” não capturada.
P.ex., um thread com erro no código que produza um loop infinito não pode ser interrompido - a menos que a JVM seja finalizada.
<blockquote>void join()
Waits for this thread to die.
void join(long millis)
Waits at most millis milliseconds for this thread to die.</blockquote>
Não me pergunte como usar somente está no JavaDoc. 
Mas imagino que deva funcionar, mas alguém explica como funciona
<blockquote><div class="quote-author">neohacker:</div><blockquote>void join()
Waits for this thread to die.
void join(long millis)
Waits at most millis milliseconds for this thread to die.</blockquote>
Não me pergunte como usar somente está no JavaDoc. 
Mas imagino que deva funcionar, mas alguém explica como funciona
8)
join não serve para limitar o tempo de execução de uma thread, mas para uma thread “juntar-se” àquela que está sendo executada, no fim de sua execução.
Uma coisa importante que vc. deve ter em bem claro:Um thread só pode ser interrompido de forma “colaborativa”, ou seja, se chamar em algum momento o método interrupted() ou chamar alguma rotina que lance um “InterruptedException” não capturada.
P.ex., um thread com erro no código que produza um loop infinito não pode ser interrompido - a menos que a JVM seja finalizada.
Faltou um caso: a thread também pode acabar graciosamente, finalizando o seu método run normalmente, sem estouro de exceções e sem chamada ao interrupt().
Aliás, essa deve ser a forma normal de se finalizar uma thread. Geralmente, a thread vigia alguma variável ou condição e, depois de expirada, finaliza o seu método run.
Acho que no seu caso, é o melhor jeito de fazer isso. A menos é claro que você tenha algum processamento que vá manter a thread travada…
Aí, o melhor é esperar por ele, o tempo que for necessário, ou remodelar o método que faz esse processamento, se possível.
Esse aqui seria um protótipo de um Runnable por tempo:
public class TimeRunnable implements Runnable {
private long time;
private long initialTime;
private TimeRunnable(long time) {
this.time = time;
}
public void run() {
initialTime = System.currentTimeMillis();
try {
while (System.currentTimeMillis() - initialTime < time) {
//Faz alguma coisa
}
} catch (InterruptedException e) {
//Pode ser uma boa idéia logar a exceção
}
}
}
Tome cuidado para não usar um método bloqueante no trecho "faz alguma coisa". Muitas classes de IO, como Socket por exemplo, tem versões não bloqueantes do read.
Note que o Runnable acima termina normalmente caso o tempo tenha expirado - mesmo que o interrupt não seja chamado. Essa é a "finalização graciosa", que eu estava falando ali em cima.