Java:我是不是需要保护 Thread 对象免受垃圾收集器的影响?
Posted
技术标签:
【中文标题】Java:我是不是需要保护 Thread 对象免受垃圾收集器的影响?【英文标题】:Java: do I need to protect a Thread object from the Garbage Collector?Java:我是否需要保护 Thread 对象免受垃圾收集器的影响? 【发布时间】:2011-03-18 12:16:02 【问题描述】:之后
Thread t = new Thread();
t.start();
Thread 对象是 GC 的候选对象吗?
【问题讨论】:
澄清一下——这更像是一个理论问题而不是一个实际问题——我不相信即使规范允许,任何人都会实现一个 JVM,其中 Thread 对象将成为 GC 的候选对象在上述情况下。 感谢您对这个问题的耐心等待。 【参考方案1】:不,它不符合垃圾收集的条件。由于线程被线程调度器调度在可运行队列中(在调用t.start( )
之后),它不符合GC的条件。
检查线程是否仍在运行的方法之一是调用thread.isAlive()
。
final boolean isAlive( )
如果调用它的线程仍在运行,isAlive( )
方法将返回 true。否则返回 false。
在您的情况下,您可以随时调用t.isAlive()
方法,只是为了检查线程是否处于活动状态。
当线程停止或结束其生命周期或尚未计划运行(如 Jon 的代码片段)时,它就有资格进行 GC。
【讨论】:
"在你的情况下,你总是可以调用 t.isAlive()" - 这个想法是 t 超出了范围,但是应该有一些其他的对 Thread 的引用来避免对象被 GC 'd【参考方案2】:如果它已启动,则不符合 GC 条件 - 毕竟,正在运行的代码可以请求 Thread.currentThread()
。
如果你刚刚创建它但没有启动它,像这样:
Thread pointless = new Thread();
那么我怀疑它会有资格进行 GC - 但是不启动线程就创建线程是很不寻常的。 (我想在你开始之前可能会抛出一个异常......)
【讨论】:
我所知道的未启动Thread
对象的唯一真正用例是使用 Runtime.addShutdownHook()
的关闭挂钩
"如果它启动了,它就不符合 GC 的条件——毕竟,正在运行的代码可以请求 Thread.currentThread()。"这是我的直觉,但我实际上无法从规范中找到确凿的论据 - 例如,实现是否可以使用弱引用来返回当前线程?
规范说可以从任何正在运行的线程访问的对象都会被保留,这包括线程本身。
@Mark:如果它被存储为弱引用,如果它被收集,Thread.currentThread()
会返回什么?空?
@Peter 你有推荐给我吗?【参考方案3】:
如果你想在线程完成后保留它,你只需要保护它。它在运行时不能被 GC(或线程使用的任何东西)
【讨论】:
以上是关于Java:我是不是需要保护 Thread 对象免受垃圾收集器的影响?的主要内容,如果未能解决你的问题,请参考以下文章