0

对象在完成执行java.lang.Thread后保持活动状态的原因可能是什么?run()为了帮助理解这个问题,线程是如何从ThreadGroup何时run()完成的?

更新:Thread保持活动的对象与Thread活动/活动不同。当我问这个问题时,我正在调试Thread对象泄漏(而不是泄漏)。Thread对于基于 GNU Classpath 的 JDK(Harmony 应该是其中之一,对吧?),Thread添加到ThreadGroup构造函数Thread.<init>中,一个Thread创建但未启动的将被泄漏(即,无论是否run()完成都保持活动状态)。在 HotSpot 中,Thread添加到ThreadGroupin 中Thread.start(),似乎更有意义。也就是说,只有启动了才添加,run()不挂起就保证删除。请注意,它ThreadGroup被视为 GC 根。

4

2 回答 2

2

您是在问线程在什么情况下会在完成时保持活动状态run(),或者在什么情况下java.lang.Thread对象会保持存在?您的问题似乎是在问后者,诀窍是要记住,除了控制线程之外,Thread对象也只是一个普通的 Java 对象,与其他任何人一样受制于相同的 GC 规则。因此,即使它的线程早已完成,Thread如果其他线程正在持有它(线程是 GC 根),该实例也可以保留。

简单的例子

Thread t = new Thread();
t.start(); // will finish almost instantly
t.join();
// ...

在这个例子中,线程几乎一开始就结束了,当然在join()返回的时候也结束了。但是,该Thread对象会在 GC 中存活,直到t引用超出范围或设置为另一个对象。

查看代码,通过私有方法从其ThreadGroup中删除一个Thread,该私有方法ThreadGroup.remove(Thread)由调用ThreadGroup.threadTerminated(Thread),这是一个由调用的包私有方法Thread.exit(),这是一个在JDK代码中没有调用的私有方法;它可能是由本机线程管理代码调用的。

于 2013-01-18T08:19:59.557 回答
0

您的线程对象run方法中的某些函数调用可能尚未返回,这意味着实际上 run 方法尚未完成!

我建议您在run方法的最后一行打印“已完成”之类的内容,然后在主程序运行时监视输出。

于 2013-01-18T07:21:11.137 回答