Questa domanda è stata pubblicata su qualche sito. Non ho trovato le risposte giuste lì, quindi lo pubblicherò di nuovo qui.
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
}
}
La mia domanda non riguarda l'arresto di un thread. Lasciami riformulare la mia domanda. La riga A (vedi codice sopra) inizia un nuovo thread; e la riga B rendono nullo il riferimento al thread. Quindi, la JVM ora ha un oggetto Thread (che è in stato di esecuzione) a cui non esiste alcun riferimento (come t = null nella riga B). Quindi la mia domanda è: perché questo thread (che non ha più riferimenti nel thread principale) continua a funzionare fino a quando il thread principale non è in esecuzione. Per quanto ne so, l'oggetto thread dovrebbe essere stato raccolto in modo indesiderato dopo la riga B. Ho provato a eseguire questo codice per 5 minuti e più, richiedendo a Java Runtime di eseguire GC, ma il thread non si ferma.
Spero che sia il codice che la domanda siano chiari questa volta.