matar Thread com Thread.stop()  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
leo_mf
JavaChild
[Avatar]

Membro desde: 03/10/2008 09:59:50
Mensagens: 104
Localização: São Paulo - SP
Offline

Olá pessoal.

Nas ultimas versões do Java deixarão o Thread.stop() obsoleto. e porque?

Para começar, este método ainda funciona. Mas não usem ele ou "sofrerá as conseqüências".

Quando se está executando um programa Java se cria muitos objetos. No Método run da sua Thread também se pode criar muitos objetos. Bem! Se caso eu chamar o Thread.stop() bem na hora da criação de objeto. Sabem o que acontece? O objeto é criado "pela metade"("criado pela metade" foi apenas uma expressão), então o seu programa todo morre e você verá, muito provavelmente, uma mensagem parecida com esta.
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006dc3f5d6, pid=548, tid=3412
#
# JRE version: 6.0_20-b02
# Java VM: Java HotSpot(TM) 64-Bit Server VM (16.3-b01 mixed mode windows-amd64 )
# Problematic frame:
# V [jvm.dll+0x3af5d6]
#
# An error report file with more information is saved as:
# C:\Users\leonardo\Documents\NetBeansProjects\Testes\hs_err_pid548.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#


Por isso se você quiser matar um Thread no Java. Implemente a sua solução, mas tenha cuidado!



Tento gostar do Eclipse, mas ele só me decepciona.
[Email] [MSN]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

O correto é usar uma classe que implemente a interface java.concurrent.Callable em vez de uma Thread.

Usando a interface Future (um objeto de uma classe que implementa Future é retornada pelo método submit de ExecutorService), é possível cancelar e checar se esse Callable foi cancelado.

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

Um exemplo do uso de Future e Callable está no Javadoc acima.
leo_mf
JavaChild
[Avatar]

Membro desde: 03/10/2008 09:59:50
Mensagens: 104
Localização: São Paulo - SP
Offline

O correto é usar uma classe que implemente a interface java.concurrent.Callable em vez de uma Thread.

Usando a interface Future (um objeto de uma classe que implementa Future é retornada pelo método submit de ExecutorService), é possível cancelar e checar se esse Callable foi cancelado.

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

Um exemplo do uso de Future e Callable está no Javadoc acima.


Muito interessante. Não fui apresentado a esta classe. Não costumo mexer com Thread já que meu forte é trabalhar com web.

Mas isso garante que a execução irá para no tempo certo?

Tento gostar do Eclipse, mas ele só me decepciona.
[Email] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

O método stop() foi deprecated pois ele gera leak de recursos:

1. Locks de sincronização ficam presos;
2. Arquivos podem ficar abertos;
3. Conexões de BD também.

Em resumo, você joga isso numa thread e ela aborta na hora. Nada garante que o que foi reservado por ela seja liberado.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
aeciovc
Java Ninja

Membro desde: 28/02/2008 21:15:34
Mensagens: 267
Localização: Recife
Offline

2. Arquivos podem ficar abertos;


vivi isso um tempo desses por aqui!

e como ficaria a implementação por exemplo:



abraço!

Aécio Costa
www.aeciocosta.com.br
[WWW] [MSN]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

leo_mf wrote:

Mas isso garante que a execução irá para no tempo certo?


Não: o método "cancel" apenas força uma exceção InterruptedException na thread que está executando esse Callable. Se a thread estiver porventura em um ponto em que ela não consegue ser interrompida (tipicamente quando está travada em um loop fazendo contas, sem fazer I/O como arquivos ou sockets) então ela só irá ser interrompida quando sair desse loop.
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

aeciovc wrote:
2. Arquivos podem ficar abertos;


vivi isso um tempo desses por aqui!

e como ficaria a implementação por exemplo:



abraço!


Veja o exemplo em http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

aeciovc wrote:
vivi isso um tempo desses por aqui!

e como ficaria a implementação por exemplo:


O certo seria chamar Interrupt(), que faz o que o cancel() que o entanglement está citando faz. Com as mesmas limitações.
E procurar APIs que tenham timeouts máximos para operações críticas (como I/O ou leituras de sockets).

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Exemplo.
[Thumb - teste.png]
 Nome do arquivo teste.png [Disk] Download
 Descrição
 Tamanho 4 Kbytes
 Baixado:  31 vez(es)

This message was edited 1 time. Last update was at 24/11/2010 11:26:55

leo_mf
JavaChild
[Avatar]

Membro desde: 03/10/2008 09:59:50
Mensagens: 104
Localização: São Paulo - SP
Offline

Bom pessoal para quem gosta de mexer com Thread, tenho uma boa prática para vocês.

Esse tem shutdown. Fiz uns testes e não deu nenhum problema, aparentemente.

"Eu odeio trabalhar com Threads. Malditas Threads!"

Tento gostar do Eclipse, mas ele só me decepciona.
[Email] [MSN]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

leo_mf wrote:Bom pessoal para quem gosta de mexer com Thread, tenho uma boa prática para vocês.

Esse tem shutdown. Fiz uns testes e não deu nenhum problema, aparentemente.

"Eu odeio trabalhar com Threads. Malditas Threads!"


Cuidado - o nome "thread" que você deu ao ExecutorService é realmente "misleading" (enganador).

Acho que pior que comentários incorretos são nomes enganadores para variáveis.

Um ExecutorService não é e nunca vai ser uma thread. Objetos cujas classes implementam ExecutorService, como o próprio nome indica, servem para solicitar a execução de comandos, que casualmente podem ser associados a threads, ou não, conforme a implementação do ExecutorService. Você poderia ter um ExecutorService que rodasse as coisas na mesma thread do programa principal.
leo_mf
JavaChild
[Avatar]

Membro desde: 03/10/2008 09:59:50
Mensagens: 104
Localização: São Paulo - SP
Offline

Senhor, entanglement

Desculpe por isso, prometo que nunca mais vai acontecer.


Arrumei o código de acordo com seu comentário.


Acho que pior que comentários incorretos são nomes enganadores para variáveis.


Magoei com isso . Não precisava falar assim.

This message was edited 3 times. Last update was at 24/11/2010 14:56:47


Tento gostar do Eclipse, mas ele só me decepciona.
[Email] [MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team