Reiniciando uma Thread

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

“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.

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?

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.

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).