Bu soru bazı sitelerde yayınlandı. Orada doğru cevapları bulamadım, bu yüzden buraya tekrar gönderiyorum.
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
}
}
Sorgum bir İş Parçacığını durdurmakla ilgili değil. Sorumu yeniden ifade etmeme izin verin. Satır A (yukarıdaki koda bakın) yeni bir Konu başlatır; ve B Hattı, iş parçacığı referansını boş yapar. Bu nedenle, JVM artık referans olmayan (B Satırında t = null gibi) bir Konu Nesnesine (çalışır durumda olan) sahiptir. Öyleyse sorum şu, bu iş parçacığı (artık ana iş parçacığında referansı olmayan) neden ana iş parçacığı çalışana kadar çalışmaya devam ediyor. Anladığım kadarıyla, iş parçacığı nesnesi B Satırından sonra çöp olarak toplanmış olmalıydı. Bu kodu 5 dakika ve daha fazla çalıştırmayı denedim, Java Runtime'dan GC'yi çalıştırmasını istedim, ancak iş parçacığı durmuyor.
Umarım bu sefer hem kod hem de soru açıktır.