Diese Frage wurde auf einer Website veröffentlicht. Ich habe dort keine richtigen Antworten gefunden, deshalb poste ich sie hier erneut.
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
}
}
Bei meiner Abfrage geht es nicht darum, einen Thread zu stoppen. Lassen Sie mich meine Frage umformulieren. Zeile A (siehe Code oben) startet einen neuen Thread. und Zeile B machen die Thread-Referenz null. Die JVM verfügt nun über ein Thread-Objekt (das sich im laufenden Zustand befindet), auf das kein Verweis vorhanden ist (als t = null in Zeile B). Meine Frage ist also, warum dieser Thread (der im Hauptthread keine Referenz mehr hat) so lange läuft, bis der Hauptthread läuft. Nach meinem Verständnis sollte das Thread-Objekt nach Zeile B durch Müll gesammelt worden sein. Ich habe versucht, diesen Code 5 Minuten und länger auszuführen, wobei Java Runtime aufgefordert wurde, GC auszuführen, aber der Thread stoppt einfach nicht.
Hoffe, dass diesmal sowohl der Code als auch die Frage klar sind.