2013-01-18 108 views
0

java.lang.Thread對象在其run()完成執行後保持活動狀態的原因是什麼?爲了幫助理解這個問題,當run()完成時,線程是如何從ThreadGroup中刪除的?運行後java線程對象保持活動狀態()完成

更新:Thread保持活動狀態的對象與Thread活動/活動狀態不同。當我問這個問題時,我正在調試Thread對象泄漏(而不是Thread泄漏)。對於基於GNU Classpath的JDK(Harmony應該是其中之一,對嗎?),Thread被添加到ThreadGroup的構造函數Thread.<init>中,並且創建但未啓動的Thread將泄漏(即無論run()是否完成都保持活動狀態)。在熱點,Thread被添加到ThreadGroupThread.start(),這似乎更有意義。換句話說,它僅在啓動時才被添加,並且如果run()未掛起,則保證被刪除。請注意,ThreadGroup被視爲GC根。

回答

0

您的線程對象run方法中的某些函數調用有可能還沒有返回,這意味着實際上run方法尚未完成!

我建議你在你的最後一行run方法打印「Finished」之類的東西,然後監視主程序中的輸出時間。

+0

我100%確定run()完成,因爲在Eclipse調試模式下,線程沒有顯示在活動線程列表中。 – dacongy

+0

可以給我們發送代碼!否則沒有人可以幫助更多的猜測! – ehsun7b

+0

@ehsun你的意思是'你能*編輯*代碼*到你的文章*'中。 – EJP

2

你問在什麼情況下線程會在run()完成時保持活動狀態,或者在什麼情況下java.lang.Thread對象留在哪裏?你的問題似乎要問後者,而且要記住,除了控制線程之外,Thread對象也只是普通的ol對象,遵循與其他任何人相同的GC規則。所以,即使它的線程早已完成,如果其他線程持有它(線程是GC根),Thread實例也可以繼續存在。

簡單的例子

Thread t = new Thread(); 
t.start(); // will finish almost instantly 
t.join(); 
// ... 

在這個例子中,線程完成幾乎只要它開始,當然由join()返回的時間。然而,Thread對象仍然存在GC,直到t引用超出範圍或被設置爲另一個對象。

綜觀代碼,一個線程被從它的線程組經由專用方法ThreadGroup.remove(Thread),這是由ThreadGroup.threadTerminated(Thread)調用,它是由Thread.exit()調用的包專用方法,它是用在JDK沒有調用一個私有方法除去碼;它大概是由本地線程管理代碼調用的。

相關問題