Memória cheia. Tem thread rodando será isso?

Tenho um código pra manter:

if(x==0){
Thread t = new Thread("xxx");
t.start();
}else if(x==12){
Thread t = new Thread("yyy");
t.start();
} // aqui continua outros else if

Minha dúvida é, quando ela faz um start com t.start, após o término do método RUN da thread, ela num libera todos recursos e a thread morre? ou não, precisasia chamar o destroy()?

acho que é isso que está consumindo memória.

A resposta certa é “boa pergunta”.

O correto é pegar algum programa, como o jhat, e ver que objetos no seu programa estão consumindo mais memória.

Tipo quantas vezes vc chama esse metodo ai?
Vc deve ta chamando milhoes de vezes num curto intervalo de tempo nem dando tempo pra Thread terminar o run dela.
Outra coisa, vc deu wait em algum lugar?

A única liberação de memória que acontece é pelo coletor de lixo. Se a Thread mantinha referência a objetos e, ao morrer, estes objetos se tornam inalcançáveis, o coletor de lixo vai pegá-los. Se estes ainda continuam alcançáveis, o coletor de lixo não vai pegá-los.

Não use o método Thread.destroy(). Ele é depreciado, nunca foi implementado e provavelmente nunca vai ser implementado (se você chamá-lo, ele lança um Error dizendo que não foi implementado).

Não querendo ser chato mas ficaria melhor se vc deixasse assim:


Thread t = null;
if(x==0){   
 t = new Thread("xxx");   
}else if(x==12){   
 t = new Thread("yyy");   
} // aqui continua outros else if 

 if (t != null) {
   t.start();   
 }

[quote=Sagatiba]Tipo quantas vezes vc chama esse metodo ai?
Vc deve ta chamando milhoes de vezes num curto intervalo de tempo nem dando tempo pra Thread terminar o run dela.
Outra coisa, vc deu wait em algum lugar?
[/quote]

Se esse for realmente o caso, dá uma olhada no java.concurrent.ExecutorService :wink: