Этот вопрос был размещен на каком-то сайте. Я не нашел там правильных ответов, поэтому снова публикую здесь.
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
}
}
Мой вопрос не в остановке потока. Разрешите перефразировать свой вопрос. Строка A (см. Код выше) запускает новый поток; и строка B делает ссылку на поток нулевой. Итак, JVM теперь имеет объект потока (который находится в рабочем состоянии), на который не существует ссылки (как t = null в строке B). Итак, у меня вопрос: почему этот поток (который больше не имеет ссылки в основном потоке) продолжает работать до тех пор, пока не будет запущен основной поток. Насколько я понимаю, объект потока должен был быть обработан сборщиком мусора после строки B. Я пытался запустить этот код в течение 5 минут и более, запрашивая среду выполнения Java для запуска GC, но поток просто не останавливается.
Надеюсь, на этот раз и код, и вопрос ясны.