이 질문은 일부 사이트에 게시되었습니다. 거기에서 정답을 찾지 못해서 다시 여기에 게시하겠습니다.
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는 스레드 참조를 null로 만듭니다. 따라서 JVM에는 이제 참조가없는 스레드 개체 (실행 중 상태)가 있습니다 (줄 B의 t = null). 그래서 내 질문은 왜이 스레드 (주 스레드에 더 이상 참조가 없음)가 주 스레드가 실행될 때까지 계속 실행됩니까? 내 이해에 따르면 스레드 개체는 라인 B 이후에 가비지 수집되어야합니다.이 코드를 5 분 이상 실행하여 Java 런타임에 GC를 실행하도록 요청했지만 스레드가 멈추지 않습니다.
이번에는 코드와 질문이 모두 명확하기를 바랍니다.