Esta questão foi postada em algum site. Não encontrei as respostas certas lá, então estou postando aqui novamente.
public class TestThread {
public static void main(String[] s) {
// anonymous class extends Thread
Thread t = new Thread() {
public void run() {
// infinite loop
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// as long as this line printed out, you know it is alive.
System.out.println("thread is running...");
}
}
};
t.start(); // Line A
t = null; // Line B
// no more references for Thread t
// another infinite loop
while (true) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
System.gc();
System.out.println("Executed System.gc()");
} // The program will run forever until you use ^C to stop it
}
}
Minha consulta não é sobre interromper um Thread. Deixe-me reformular minha pergunta. A linha A (veja o código acima) inicia um novo Thread; e a linha B torna a referência de thread nula. Portanto, a JVM agora tem um Thread Object (que está em estado de execução) para o qual não existe referência (como t = null na Linha B). Então, minha pergunta é: por que esse thread (que não tem mais referência no thread principal) continua em execução até que o thread principal esteja em execução. No meu entendimento, o objeto thread deveria ter sido coletado como lixo após a Linha B. Tentei executar este código por 5 minutos ou mais, solicitando o Java Runtime para executar GC, mas o thread simplesmente não para.
Espero que o código e a pergunta estejam claros desta vez.