Thread Terminated

Uma perguntinha básica sobre threads: Quando a Thread esta no estado TERMINATED por concluir a execução do método run(), ela libera seus recursos para o Garbage Collector?

Os recursos relacionados ao SO, sim. Entretanto, se seu Runnable ainda possuir uma referência em algum lugar, alguns recursos desse runnable podem continuar presos. O mesmo vale para outros recursos onde um close seja necessário, tal como arquivos.

É bom sempre diferenciar a thread em si, do objeto que representa a thread (Runnable) e do objeto que dispara a thread (filho da classe Thread).

Certo, perguntei isto, porque estou utilizando Threads para controlar diversos sockets. As instâncias de MinhaThread são filhas de Thread. Cada uma possui variáveis como Connection e Thread.

Se ocorrer um timeout ou outras situações, o método run é terminado e o estado da thread é alterado para Terminated. E o método close para o socket e arquivos é invocado. Desta forma os recursos de arquivo e socket são liberados correto?

É algo importante, pois estes recursos podem ficar “pendurados” por um bom tempo até serem liberados.

Certo. O close está dentro de um finally?

Se o código simplesmente abortar, o GC até irá chamar o close cedo ou tarde, mas pode ser tarde demais. Só um finally pode garantir a execução imediata dos métodos.

Também é sempre bom usar um profiler e monitorar sua aplicação por um bom tempo, caso ela seja assim tão crítica.

sim, dentro de um finally. Isto dentro de um if / else para testar a condição do método run.

Obrigado pela ajuda.
:slight_smile:

Beleza. Você conhece o Visual VM? Em aplicações desse tipo, ele vale ouro:
http://java.sun.com/javase/6/docs/technotes/guides/visualvm/intro.html
https://visualvm.dev.java.net/

Não, nunca utilizei o visual vm.
O único programa que utilizei para visualizar a memória foi o jConsole que vem junto com a JDK. Mas com este temos apenas uma idéia em termos de memória utilizada, e Threads em execução.
Vou dar uma olhada neste dai, também vem com o JDK né.

Valeu a dica :wink: