คำถามนี้ถูกโพสต์ในบางไซต์ ฉันไม่พบคำตอบที่ถูกต้องดังนั้นฉันจึงโพสต์ที่นี่อีกครั้ง
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 จึงมี Thread Object (ซึ่งอยู่ในสถานะกำลังรัน) ซึ่งไม่มีการอ้างอิง (เป็น t = null ในบรรทัด B) ดังนั้นคำถามของฉันคือทำไมเธรดนี้ (ซึ่งไม่มีการอ้างอิงอีกต่อไปในเธรดหลัก) ยังคงทำงานต่อไปจนกว่าเธรดหลักจะทำงาน ตามความเข้าใจของฉันวัตถุเธรดควรเป็นขยะที่รวบรวมโพสต์บรรทัด B ฉันพยายามเรียกใช้รหัสนี้เป็นเวลา 5 นาทีขึ้นไปขอให้ Java Runtime รัน GC แต่เธรดก็ไม่หยุด
หวังว่าทั้งรหัสและคำถามจะชัดเจนในครั้งนี้