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