回答
如果它已經啓動,那麼它不符合GC的要求 - 畢竟,運行的代碼可能要求Thread.currentThread()
。
如果您剛剛創建,但沒有啓動它,像這樣:
{
Thread pointless = new Thread();
}
然後我懷疑這將資格GC - 但它是相當不尋常的,但不啓動它來創建一個線程。 (我猜在你啓動它之前可能會拋出一個異常......)
我知道使用['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
「如果它已經啓動,那麼它不符合GC的要求 - 畢竟,正在運行的代碼可以要求使用Thread.currentThread()。」這是我的直覺,但我實際上無法從規範中找到確鑿的說法 - 例如,實現是否可以使用弱引用來返回當前線程? – 2011-03-18 12:40:37
規範說明可以從任何正在運行的線程訪問的對象都被保留,這包括線程本身。 – 2011-03-18 13:19:43
不,它不符合垃圾回收的條件。由於線程調度程序(在調用t.start()
後)將線程安排在可運行隊列中,因此它不符合GC的條件。
檢查線程是否仍在運行的方法之一是調用thread.isAlive()
。
final boolean isAlive()
如果被調用的線程仍在運行,則isAlive()
方法返回true。否則返回false。 就你而言,你總是可以調用t.isAlive()
方法,只是爲了檢查線程是否存在。
當線程停止或結束其生命週期或尚未計劃運行(如Jon的代碼片段)時,則它符合GC的條件。
「在你的情況下,你總是可以調用t.isAlive()」 - 這個想法是t超出了範圍,但是應該有一些其他的引用來避免對象成爲GC' d – 2011-03-18 12:42:34
如果您想在完成後保留線程,則只需要保護線程。它在運行時不能被GC'ed(或任何線程使用)
- 1. Java的垃圾收集器會中斷一個線程嗎?
- 2. 使用垃圾收集時,我需要保留屬性嗎?
- 3. 需要澄清java垃圾收集複製收集器
- 4. 守護線程垃圾收集器的父線程是什麼?
- 5. Java線程垃圾收集與否
- 6. 垃圾收集對象
- 7. C有垃圾收集器像Java嗎?
- 8. Java垃圾收集和大對象
- 9. 如何防止從不同線程垃圾收集PyQt對象?
- 10. 在讓垃圾收集垃圾之前,我需要釋放Swing組件嗎?
- 11. ActiveX對象和.NET垃圾收集器
- 12. 垃圾收集java
- 13. Java垃圾收集
- 14. Java垃圾收集
- 15. 垃圾收集器如何確定對象是否是垃圾?
- 16. 垃圾收集器
- 17. 垃圾收集 - 是否需要?
- 18. 這會收集垃圾嗎?
- 19. 我可以找出一代垃圾收集器中的所有對象嗎?
- 20. 垃圾收集器在收集死對象時會做什麼?
- 21. 的Java newSingleThreadExecutor垃圾收集
- 22. Java垃圾收集和空
- 23. Java垃圾收集問題
- 24. Java垃圾收集算法
- 25. 評估之前應該對垃圾收集功能進行垃圾收集嗎?
- 26. 保守的垃圾收集器
- 27. C++有垃圾收集器嗎?
- 28. Android的垃圾收集對象
- 29. 垃圾收集資格對象
- 30. 如何跟蹤垃圾收集對象
澄清 - 這是一個理論問題而不是實際問題 - 我不相信即使規範允許它,任何人都會執行在上述場景中,Thread對象將成爲GC的候選者的JVM。 – 2011-03-18 12:47:14
感謝您對此問題的耐心等待。 – 2011-03-18 14:40:05