[我開始之前,我試圖尋找相關的問題,因爲我沒有發現,我在這裏問一個問題]的Java多線程:行爲當線程對象的引用計數爲零
我學習Java和以下場景打我的頭:
class MyThread extends Thread {
void run(){
//a heavy function
}
}
現在在主線程中,我調用這個主題爲:
public static void main(...){
new MyThread().start();
System.gc(); //just a request..
//end of main thread too.
//Reference to that MyThread object is now zero.
}
我跑的代碼。看來線程還活着。程序結束時全部線程退出。
我的問題:
- 當引用計數爲零,不會對線程GC資格?如果它真的符合條件,垃圾收集的行爲是什麼?線程是否會被終止?
- 我知道這是一件壞事,但是它的定義是沒有
otherThread.join()
在main()
?
我有我自己的一些解釋(但我不知道我是多麼正確的 - 因此,我在這裏發了一個帖子):只要
- JVM maitains到線程的引用它是有效。所以ref ref永遠不會真的爲零。
- 執行函數有一個隱含的
this
引用,所以ref計數再次不爲零。
我在上面的任何解釋中正確嗎?或者還有其他解釋嗎?
感謝和問候:)
+1,謝謝你非常確切的回答:) – SuperSaiyan 2012-07-16 07:34:54
+1 JLS沒有說JVM不會使用引用計數。 AFAIK沒有做,因爲其已知的限制。 – 2012-07-16 08:18:02
我認爲第一句話是微不足道的。我們必須注意區分一個'Thread'實例和實際的執行線程。 'new Thread()'**不會創建一個線程,也不會創建一個線程,也不會讓這個實例的GC神奇地停止線程 - 不過,新文件()的GCing會刪除一個文件磁盤。正確的答案是,通過Thread.currentThread()可以訪問線程本地引用,這使得在執行底層線程時可以隨時訪問Thread實例。 – 2012-07-16 08:26:12