回答
如果它已经启动,那么它不符合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