Esta pregunta se publicó en algún sitio. No encontré las respuestas correctas allí, así que lo estoy publicando aquí nuevamente.
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
}
}
Mi consulta no se trata de detener un hilo. Permítame rehacer mi pregunta. La línea A (ver código arriba) inicia un nuevo hilo; y la línea B hacen nula la referencia del hilo. Entonces, la JVM ahora tiene un objeto Thread (que está en estado de ejecución) al que no existe ninguna referencia (como t = nulo en la línea B). Entonces mi pregunta es, ¿por qué este hilo (que ya no tiene referencia en el hilo principal) sigue ejecutándose hasta que el hilo principal se está ejecutando? Según tengo entendido, el objeto del hilo debería haber sido recolectado como basura después de la Línea B. Intenté ejecutar este código durante 5 minutos y más, solicitando Java Runtime para ejecutar GC, pero el hilo simplemente no se detiene.
Espero que tanto el código como la pregunta estén claros esta vez.