Thread isAlive() - problemas

4 respostas
M

Pessoal,

Uma ajuda. Tenho uma aplicação que lança uma Thread que realiza vários processos dentre eles acesso a banco de dados. Essa Thread demora muito tento em execução. De tempos em tempos preciso verificar se ela está rodando e caso não esteja, disparo ela novamente para realizar o mesmo processo porem para outros dados.

Primeira pergunta: como saber se Thread está rodando? Logicamente, use o ?isAlive()?.

Entretanto, verifiquei que em alguns casos mesmo a Thread rodando o método ?isAlive()? está retornando ?false? indicando que o Thread não está rodando. Contudo, está errado.

Essa Thread acessa o banco de dados e fica aguardando durante muito tempo; entretanto, mesmo nesse momento o método ?isAlive()? deveria retornar false, ou estou errado?

Alguma sugestão?

Obrigado.

4 Respostas

R

Sim, de acordo com o javadoc, o método isAlive deve retornar true se a thread foi iniciada e ainda não terminou o método run:

Pergunto:

Você realiza a chamada ao isAlive() nesta thread e o mesmo retorna false. Depois de algum tempo, vc verifica que esta thread ainda está executando? Chama o isAlive de novo e o mesmo retorna true?

uma sugestão seria programar um timer para lançar essa thread de tempos em tempos.

V

Ao invés de ficar fazendo pooling no isAlive(), é melhor programar sua thread para avisar quando morreu. Para isso, use o padrão observer para que a thread que atua sobre o BD tenha como listener o objeto da thread que a disparou, e avise-a quando a operação terminar. Aí fica bem fácil saber se a execução já terminou ou não.

Outra vantagem é que você também pode programar o seu listener para disparar informações de status, para fazer uma barra de rolagem andar, por exemplo.

B

Algum problema em utilizar o
t.getState() == Thread.State.TERMINATED;

Sempre utilizo e aparentemente funciona.

M

rod.attack:
Sim, de acordo com o javadoc, o método isAlive deve retornar true se a thread foi iniciada e ainda não terminou o método run:

Pergunto:

Você realiza a chamada ao isAlive() nesta thread e o mesmo retorna false. Depois de algum tempo, vc verifica que esta thread ainda está executando? Chama o isAlive de novo e o mesmo retorna true?

uma sugestão seria programar um timer para lançar essa thread de tempos em tempos.

>>Você realiza a chamada ao isAlive() nesta thread e o mesmo retorna false.
Sim

>>Depois de algum tempo, vc verifica que esta thread ainda está executando? Chama o isAlive de novo e o mesmo retorna true?
Eu chamo novamente, ele está rodando, mas o método retorna false indicando que não está rodando.

Tenho um objeto X e dentro dele verifico se a thread está rodando. O objeto X é um job

Criado 1 de fevereiro de 2010
Ultima resposta 1 de fev. de 2010
Respostas 4
Participantes 4