Câu hỏi này đã được đăng trên một số trang web. Tôi không tìm thấy câu trả lời đúng ở đó, vì vậy tôi đăng lại ở đây.
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
}
}
Truy vấn của tôi không phải về việc dừng một Chủ đề. Hãy để tôi nói lại câu hỏi của tôi. Dòng A (xem đoạn mã ở trên) bắt đầu một Chủ đề mới; và Dòng B làm cho tham chiếu luồng trống. Vì vậy, JVM bây giờ có một Đối tượng Chủ đề (đang ở trạng thái đang chạy) mà không có tham chiếu nào tồn tại (như t = null trong Dòng B). Vì vậy, câu hỏi của tôi là, tại sao luồng này (không còn tham chiếu trong luồng chính) tiếp tục chạy cho đến khi luồng chính đang chạy. Theo hiểu biết của tôi, đối tượng luồng lẽ ra đã được thu gom rác sau Dòng B. Tôi đã cố gắng chạy đoạn mã này trong 5 phút và hơn, yêu cầu Java Runtime chạy GC, nhưng luồng không dừng lại.
Hy vọng cả mã và câu hỏi đều rõ ràng lần này.