2011-03-18 85 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(或任何线程使用)