To pytanie zostało opublikowane w jakiejś witrynie. Nie znalazłem tam właściwych odpowiedzi, więc zamieszczam je tutaj ponownie.
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
}
}
Moje zapytanie nie dotyczy zatrzymania wątku. Pozwólcie, że przeformułuję moje pytanie. Linia A (patrz kod powyżej) rozpoczyna nowy wątek; i Linia B sprawiają, że odwołanie do wątku jest puste. Tak więc maszyna JVM ma teraz obiekt wątku (który jest uruchomiony), do którego nie istnieje żadne odniesienie (jako t = null w wierszu B). Moje pytanie brzmi więc, dlaczego ten wątek (który nie ma już odniesienia w głównym wątku) działa dalej, dopóki nie zostanie uruchomiony główny wątek. Zgodnie z moim zrozumieniem obiekt wątku powinien zostać usunięty po linii B. Próbowałem uruchomić ten kod przez 5 minut i dłużej, żądając Java Runtime do uruchomienia GC, ale wątek po prostu się nie zatrzymuje.
Mam nadzieję, że tym razem zarówno kod, jak i pytanie są jasne.