Reiniciando uma Thread

4 respostas
M

Andei pesquisando em vários tópicos, mas não encontrei uma resposta que resolva meu problema.

Tenho um programa que executa diversas threads simultâneamente. Cada thread é independente e como estou prevendo que alguma delas possa travar durante a execução, estou implementando uma outra thread que faz o controle da execução dessas threads. Enfim, meu problema é, quando a thread de controle detectar que alguma das threads está travada, ela deverá matar a tal thread e iniciá-la novamente. E é aí que está meu problema, não conseguí nenhum método capaz de parar a thread efetivamente para reiniciar a thread.

Já fiz diversos testes para tentar parar a thread e todos sem sucesso.
Nos testes, já usei interrupt, join, stop (mesmo estando deprecated), destroy (mesma coisa que o stop), tentei colocar a thread para dormir antes de matá-la, notify também.

Alguns casos até que estavam cumprindo o papel, como o interrupt em algumas situações, mas depois de executar o tal comando, não conseguia iniciar a thread novamente, causando exception no método start.

Se acharem que precisam do código para facilitar uma solução, postarei aqui, ou se tiverem uma solução que seja capaz de fazer o que estou precisando, um simples stop e start na thread, está ótimo.

Vlw

4 Respostas

T

“Matar” uma thread não é recomendado (e nem funciona, na verdade); e reiniciar do ponto em que parou é meio complicado.
Se você precisar sair antes de uma thread, então ponha vários pontos de verificação* dentro dela (principalmente dentro de operações lentas), para você poder controlá-la.

  • Esse ponto de verificação pode ser algo tão simples quanto checar um flag, definido como “public volatile boolean stop;” ou coisa parecida.
ViniGodoy

Só uma outra dúvida. Que comando é esse que trava sua Thread?
Ele está totalmente fora de seu controle? Não tem como vc substituir por um comando que não trava?

M

Na verdade, estou fazendo esse controle para evitar que a thread deixe de funcionar por algum travamento, para que assim o programa possa se reestabelecer sem intervenção humana.

Quero parar ela e iniciar do começo, e não de onde tinha parado.

Aldrin_Leal

Sugiro que você estude o package java.util.concurrent, especialmente o MutableBoolean e o framework executor. Isto irá garantir a gerência do seu banco de Threads. Eu faço deste jeito.

Quanto ao QUE TRAVA: Bem, isto é a parte mais importante. Como você deve ter percebido, é responsabilidade sua garantir que a mesma não trave. Isto envolve você analisar o seu código pelos trechos aonde a Thread fica bloqueada.

Perceba que isto é um ponto aonde não pode ter achismo: Você precisa identificar efetivamente o que trata, e em que condições. Quanto a isto, sugiro um bom conhecimento de depuração de processos via JWDP/JVMTI (o mecanismo de depuração de processos - Em particular o de Depuração Remota).

Criado 23 de novembro de 2007
Ultima resposta 23 de nov. de 2007
Respostas 4
Participantes 4