यह प्रश्न कुछ साइट पर पोस्ट किया गया था। मुझे वहां सही जवाब नहीं मिला, इसलिए मैं इसे यहां फिर से पोस्ट कर रहा हूं।जावा थ्रेड कचरा एकत्रित या नहीं
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
}
}
मेरी क्वेरी थ्रेड को रोकने के बारे में नहीं है। मुझे अपने प्रश्न को दोबारा दोहराएं। रेखा ए (उपरोक्त कोड देखें) एक नया थ्रेड शुरू करता है; और रेखा बी धागा संदर्भ शून्य बनाते हैं। इसलिए, JVM में अब एक थ्रेड ऑब्जेक्ट है (जो चलने वाले राज्य में है) जिसके लिए कोई संदर्भ मौजूद नहीं है (जैसा कि रेखा बी में टी = शून्य है)। तो मेरा सवाल यह है कि, यह धागा (मुख्य धागे में अब कोई संदर्भ नहीं है) मुख्य धागा चलने तक चल रहा है। मेरी समझ के अनुसार, थ्रेड ऑब्जेक्ट को लाइन बी के बाद एकत्रित कचरा होना चाहिए था। मैंने इस कोड को 5 मिनट और अधिक के लिए चलाने की कोशिश की, जावा रनटाइम जीसी चलाने के लिए अनुरोध किया, लेकिन थ्रेड बस रुकता नहीं है।
आशा है कि इस समय कोड और प्रश्न दोनों स्पष्ट हैं।
यह उत्तर, जैसा कि वर्तमान में खड़ा है, सवाल उठता है अगर थ्रेड जीसीड किया जा सकता है (वे समाप्त होने के बाद)। चूंकि इस प्रश्न को [इस एक] के डुप्लिकेट के रूप में चिह्नित किया गया है (http://stackoverflow.com/questions/10380327/java-threads-and-garbage-collector), यह उल्लेख किया जाना चाहिए कि धागे को अब " कचरा संग्रहण जड़ें "समाप्त होने के बाद, और इस प्रकार, वे जीसी के लिए पहुंच योग्य बन जाते हैं। – bluenote10
@ bluenote10 सही, इसलिए वाक्यांश "चलने वाला धागा"। – falstro
अंतिम वाक्य penetrating है: "आपका मुख्य धागा कचरा क्यों नहीं है ..."। – Determinant