Questa domanda è stata pubblicata su alcuni siti. Non ho trovato le risposte giuste lì, quindi lo sto postando di nuovo qui.Thread Java Rifiuti raccolti o meno
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'interruzione di una discussione. Lasciatemi riformulare la mia domanda. La riga A (vedere il codice sopra) inizia una nuova discussione; e la linea B rende il riferimento del filo nullo. Quindi, la JVM ora ha un oggetto Thread (che è in esecuzione) a cui non esiste alcun riferimento (come t = null nella Linea B). Quindi la mia domanda è, perché questo thread (che non ha più riferimenti nel thread principale) continua a essere in esecuzione fino a quando il thread principale è in esecuzione. Per mia comprensione, l'oggetto thread avrebbe dovuto essere garbage collection post Line B. Ho provato a eseguire questo codice per 5 minuti e oltre, richiedendo Java Runtime per eseguire GC, ma il thread non si ferma.
Spero che sia il codice sia la domanda siano chiari questa volta.
Questa risposta, al momento attuale, solleva la questione se i thread possono essere sottoposti a GC (dopo la loro chiusura). Poiché questa domanda è contrassegnata come duplicato di [questo] (http://stackoverflow.com/questions/10380327/java-threads-and-garbage-collector), è necessario ricordare che i thread non saranno più contrassegnati come " root di garbage collection "dopo che sono terminati e quindi diventano accessibili per GC. – bluenote10
@ bluenote10 corretto, quindi la frase "thread in esecuzione". – falstro
L'ultima frase è penetrante: "perché il tuo thread principale non è spazzatura ...". – Determinant