Como você mata um java.lang.Thread
em Java?
java
multithreading
interrupt
flybywire
fonte
fonte
ExecutorStatus
essa questão: stackoverflow.com/questions/2275443/how-to-timeout-a-threadRespostas:
Veja este tópico da Sun sobre por que eles foram reprovados
Thread.stop()
. Ele entra em detalhes sobre por que esse foi um método ruim e o que deve ser feito para parar com segurança os encadeamentos em geral.A maneira que eles recomendam é usar uma variável compartilhada como um sinalizador que solicita que o encadeamento em segundo plano pare. Essa variável pode então ser definida por um objeto diferente solicitando o encerramento do encadeamento.
fonte
getConnection()
dejava.sql.DriverManager
. Se a tentativa de conexão demorar muito, eu tento eliminar o segmento correspondente chamando,Thread.interrupt()
mas ele não influencia o segmento. AsThread.stop()
obras, no entanto, embora a Oracle diga que não deve funcionar se não funcionarinterrupt()
. Gostaria de saber como fazê-lo funcionar e evitar o uso de método obsoleto.Geralmente você não ..
Você pede para interromper o que está fazendo usando Thread.interrupt () (link javadoc)
Uma boa explicação do porquê está no javadoc aqui (link do java technote)
fonte
interrupt()
método é chamado? A principal questão está relacionada à geração de logs para cada novo thread.No Java, os encadeamentos não são eliminados, mas a parada de um encadeamento é feita de maneira cooperativa . É solicitado que o encadeamento seja encerrado e, em seguida, o encadeamento pode ser encerrado normalmente.
Freqüentemente um
volatile boolean
, é usado campo que o thread verifica e finaliza periodicamente quando é definido com o valor correspondente.Eu não usaria a
boolean
para verificar se o segmento deve terminar . Se você usarvolatile
como um modificador de campo, isso funcionará de maneira confiável, mas se o seu código se tornar mais complexo, pois, em vez disso, usa outros métodos de bloqueio dentro dowhile
loop, pode acontecer que o código não seja finalizado ou pelo menos demore mais enquanto você posso querer.Cada encadeamento já possui um status booleano interrompido e você deve fazer uso dele. Pode ser implementado assim:
Código fonte adaptado do Java Concurrency in Practice . Como o
cancel()
método é público, você pode permitir que outro thread invoque esse método como desejar.fonte
Uma maneira é definir uma variável de classe e usá-la como sentinela.
Defina uma variável de classe externa, ou seja, flag = true no exemplo acima. Defina como false para 'matar' o thread.
fonte
volatile
para garantir que funcione corretamente em qualquer lugar. A classe interna não é estática, portanto, o sinalizador deve ser uma variável de instância. O sinalizador deve ser limpo em um método acessador para que outras operações (como interrupção) possam ser executadas. O nome "flag" não é descritivo.Existe uma maneira de fazer isso. Mas se você tivesse que usá-lo, você é um programador ruim ou está usando um código escrito por programadores ruins. Portanto, você deve parar de ser um programador ruim ou parar de usar esse código incorreto. Esta solução é apenas para situações em que NÃO HÁ OUTRA MANEIRA.
fonte
Thread.stop
mesmo que seja preterido.Thread.stop
faz o mesmo, mas também verifica o acesso e as permissões. O usoThread.stop
é bastante óbvio, e não me lembro do motivo pelo qual usei emThread.stop0
vez disso. TalvezThread.stop
não tenha funcionado no meu caso especial (Weblogic em Java 6). Ou talvez porqueThread.stop
esteja obsoleto e cause aviso.Quero acrescentar várias observações, com base nos comentários acumulados.
Thread.stop()
interromperá um encadeamento se o gerenciador de segurança permitir.Thread.stop()
é perigoso. Dito isto, se você estiver trabalhando em um ambiente JEE e não tiver controle sobre o código que está sendo chamado, pode ser necessário; consulte Por que o Thread.stop foi descontinuado?stop()
cria um novoThreadDeathError
erro no segmento de chamada e lança esse erro no segmento de destino . Portanto, o rastreamento da pilha geralmente não vale nada.stop()
verifica com o gerenciador de segurança e depois chama asstop1()
chamadasstop0()
.stop0()
é um código nativo.Thread.stop()
não foi removido (ainda), masThread.stop(Throwable)
foi removido no Java 11. ( lista de discussão , JDK-8204243 )fonte
Eu votaria em
Thread.stop()
.Por exemplo, você tem uma operação duradoura (como uma solicitação de rede). Supostamente, você está aguardando uma resposta, mas isso pode levar tempo e o usuário navegou para outra interface do usuário. Esse encadeamento em espera agora é a) inútil b) problema em potencial porque quando ele obtém resultado, é completamente inútil e ele aciona retornos de chamada que podem levar a vários erros.
Tudo isso e ele pode fazer um processamento de resposta que pode ser intenso na CPU. E você, como desenvolvedor, não pode nem pará-lo, porque você não pode jogar
if (Thread.currentThread().isInterrupted())
linhas em todo o código.Portanto, a incapacidade de forçar a parada de um fio é estranho.
fonte
Thread.stop()
com segurança de qualquer maneira. Você não está votandoThread.stop()
, está pedindo a todas as pessoas que implementam todas as operações que podem levar muito tempo para torná-las abortáveis com segurança. E isso pode muito bem ser uma boa idéia, mas não tem nada a ver com a implementaçãoThread.stop()
como forma de solicitar o aborto seguro. Já temosinterrupt
para isso.stop
.A questão é bastante vaga. Se você quis dizer "como eu escrevo um programa para que um thread pare de funcionar quando eu quero", várias outras respostas devem ser úteis. Mas se você quis dizer “Eu tenho uma emergência com um servidor, não posso reiniciar agora e só preciso de um encadeamento específico para morrer, aconteça o que acontecer”, então você precisará de uma ferramenta de intervenção para combinar com ferramentas de monitoramento como essa
jstack
.Para esse fim, criei jkillthread . Veja suas instruções de uso.
fonte
É claro que existe o caso em que você está executando algum tipo de código não totalmente confiável. (Eu pessoalmente tenho isso ao permitir que scripts enviados sejam executados no meu ambiente Java. Sim, há um alarme de segurança tocando em todos os lugares, mas faz parte do aplicativo.) respeitar algum tipo de sinal booleano de execução / não execução. Seu único segurança decente contra falhas é chamar o método stop no encadeamento se, por exemplo, ele for executado por mais tempo do que o tempo limite.
Mas isso é apenas "decente", e não absoluto, porque o código pode pegar o erro ThreadDeath (ou qualquer exceção que você lançar explicitamente) e não repeti-lo novamente como um encadeamento cavalheiro deve fazer. Portanto, a linha inferior é AFAIA, não existe segurança absoluta contra falhas.
fonte
Não há como matar um fio normalmente.
Você pode tentar interromper o thread, uma estratégia comum é usar uma pílula venenosa para fazer com que o thread pare
}
http://anandsekar.github.io/cancel-support-for-threads/
fonte
Geralmente, você não mata, para ou interrompe um segmento (ou verifica se ele foi interrompido ()), mas deixa que ele termine naturalmente.
É simples Você pode usar qualquer loop junto com a variável booleana (volátil) dentro do método run () para controlar a atividade do encadeamento. Você também pode retornar do thread ativo para o thread principal para pará-lo.
Dessa forma, você normalmente mata um fio :).
fonte
Tentativas de término abrupto de encadeamento são práticas ruins de programação bem conhecidas e evidências de um design de aplicativo ruim. Todos os threads no aplicativo multithread explicitamente e implicitamente compartilham o mesmo estado do processo e são forçados a cooperar entre si para mantê-lo consistente; caso contrário, seu aplicativo estará sujeito a erros que serão realmente difíceis de diagnosticar. Portanto, é responsabilidade do desenvolvedor fornecer uma garantia dessa consistência por meio do design cuidadoso e claro do aplicativo.
Existem duas soluções corretas principais para as terminações de threads controladas:
Uma explicação boa e detalhada dos problemas relacionados ao encerramento abrupto de threads, bem como exemplos de soluções erradas e corretas para o encerramento controlado de threads, podem ser encontrados aqui:
https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop%28%29+to+terminate+threads
fonte
Aqui estão algumas boas leituras sobre o assunto:
O que você faz com a InterruptedException?
Desligando os Threads de Forma Limpa
fonte
Como a interrupção não funcionou no Android, usei esse método, funciona perfeitamente:
fonte
'Matar um fio' não é a frase certa para usar. Aqui está uma maneira de implementar a graciosa conclusão / saída do encadeamento no vontade:
Executável que eu usei:
A classe acionadora:
fonte
Thread.stop está obsoleto. Como podemos parar um thread em java?
Sempre use o método de interrupção e o futuro para solicitar o cancelamento
fonte