2011-03-18 79 views
3

Java:我需要從垃圾收集器保護一個線程對象嗎?

{ 
Thread t = new Thread(); 
t.start(); 
} 

後,線程對象的GC的候選人?

+0

澄清 - 這是一個理論問題而不是實際問題 - 我不相信即使規範允許它,任何人都會執行在上述場景中,Thread對象將成爲GC的候選者的JVM。 – 2011-03-18 12:47:14

+0

感謝您對此問題的耐心等待。 – 2011-03-18 14:40:05

回答

5

如果它已經啓動,那麼它不符合GC的要求 - 畢竟,運行的代碼可能要求Thread.currentThread()

如果您剛剛創建,但沒有啓動它,像這樣:

{ 
    Thread pointless = new Thread(); 
} 

然後我懷疑這資格GC - 但它是相當不尋常的,但不啓動它來創建一個線程。 (我猜在你啓動它之前可能會拋出一個異常......)

+0

我知道使用['Runtime.addShutdownHook()']的未啓動'Thread'對象的唯一實際用例是(http://download.oracle.com/javase/6/docs/api/java/lang /Runtime.html#addShutdownHook(java.lang.Thread)) – 2011-03-18 12:20:31

+0

「如果它已經啓動,那麼它不符合GC的要求 - 畢竟,正在運行的代碼可以要求使用Thread.currentThread()。」這是我的直覺,但我實際上無法從規範中找到確鑿的說法 - 例如,實現是否可以使用弱引用來返回當前線程? – 2011-03-18 12:40:37

+0

規範說明可以從任何正在運行的線程訪問的對象都被保留,這包括線程本身。 – 2011-03-18 13:19:43

6

不,它不符合垃圾回收的條件。由於線程調度程序(在調用t.start()後)將線程安排在可運行隊列中,因此它不符合GC的條件。

檢查線程是否仍在運行的方法之一是調用thread.isAlive()

final boolean isAlive() 

如果被調用的線程仍在運行,則isAlive()方法返回true。否則返回false。 就你而言,你總是可以調用t.isAlive()方法,只是爲了檢查線程是否存在。

當線程停止或結束其生命週期或尚未計劃運行(如Jon的代碼片段)時,則它符合GC的條件。

+0

「在你的情況下,你總是可以調用t.isAlive()」 - 這個想法是t超出了範圍,但是應該有一些其他的引用來避免對象成爲GC' d – 2011-03-18 12:42:34

0

如果您想在完成後保留線程,則只需要保護線程。它在運行時不能被GC'ed(或任何線程使用)