この質問はいくつかのサイトに投稿されました。正しい答えが見つからなかったので、ここにもう一度投稿します。
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を実行するように要求しましたが、スレッドが停止しません。
今回はコードと質問の両方が明確であることを願っています。