[我开始之前,我试图寻找相关的问题,因为我没有发现,我在这里问一个问题]的Java多线程:行为当线程对象的引用计数为零
我学习Java和以下场景打我的头:
class MyThread extends Thread {
void run(){
//a heavy function
}
}
现在在主线程中,我调用这个主题为:
public static void main(...){
new MyThread().start();
System.gc(); //just a request..
//end of main thread too.
//Reference to that MyThread object is now zero.
}
我跑的代码。看来线程还活着。程序结束时全部线程退出。
我的问题:
- 当引用计数为零,不会对线程GC资格?如果它真的符合条件,垃圾收集的行为是什么?线程是否会被终止?
- 我知道这是一件坏事,但是它的定义是没有
otherThread.join()
在main()
?
我有我自己的一些解释(但我不知道我是多么正确的 - 因此,我在这里发了一个帖子):只要
- JVM maitains到线程的引用它是有效。所以ref ref永远不会真的为零。
- 执行函数有一个隐含的
this
引用,所以ref计数再次不为零。
我在上面的任何解释中正确吗?或者还有其他解释吗?
感谢和问候:)
+1,谢谢你非常确切的回答:) – SuperSaiyan 2012-07-16 07:34:54
+1 JLS没有说JVM不会使用引用计数。 AFAIK没有做,因为其已知的限制。 – 2012-07-16 08:18:02
我认为第一句话是微不足道的。我们必须注意区分一个'Thread'实例和实际的执行线程。 'new Thread()'**不会创建一个线程,也不会创建一个线程,也不会让这个实例的GC神奇地停止线程 - 不过,新文件()的GCing会删除一个文件磁盘。正确的答案是,通过Thread.currentThread()可以访问线程本地引用,这使得在执行底层线程时可以随时访问Thread实例。 – 2012-07-16 08:26:12