Це питання було розміщено на якомусь сайті. Я не знайшов правильних відповідей там, тому публікую їх тут ще раз.
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 (див. Код вище) розпочинає новий Thread; і рядок B роблять посилання на потік нульовим. Отже, JVM тепер має Thread Object (який знаходиться в робочому стані), на який не існує посилання (як t = null у рядку B). Отже, моє питання полягає в тому, чому цей потік (який більше не має посилання в основному потоці) продовжує працювати, поки не запущений основний потік. На моє розуміння, об’єктом потоку мав бути зібраний сміття після рядка Б. Я намагався запустити цей код протягом 5 хвилин і більше, вимагаючи Java Runtime для запуску GC, але потік просто не зупиняється.
Сподіваюся, і код, і питання цього разу зрозумілі.