gpt4 book ai didi

Java 多线程 : Behaviour when Reference count of thread object becomes zero

转载 作者:搜寻专家 更新时间:2023-11-01 01:03:14 25 4
gpt4 key购买 nike

[开始之前我尝试搜索相关问题,因为我没有找到,所以我在这里问一个问题]

我正在学习 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?如果真的符合条件,那么垃圾回收的行为是什么?线程会被终止吗?
  • 我知道这是一件坏事,但是在 main() 中没有 otherThread.join() 是否定义明确?

我对自己有一些解释(但我不知道我有多正确——我在这里发帖的原因):

  • 只要线程 Activity ,JVM 就会保持对线程的引用。所以引用计数永远不会真正为零。
  • 执行函数有一个隐式的this引用,因此引用计数再次不为零。

以上任何解释是否正确?或者还有什么其他的解释吗?

谢谢和问候:)

最佳答案

每个正在运行的线程都构成了 GC 的根。从根之一可到达的任何对象都不符合 GC 的条件,并且该线程具有对 java.lang.Thread 实例的线程本地引用(由 Thread.currentThread())。所以不,您的线程在结束运行之前不会被 GC,因为可以从正在运行的线程访问 Thread 实例。

我不明白为什么不在生成的线程上调用 join() 会是一件坏事。如果您不关心生成的线程何时结束,则不需要加入它。当最后一个非守护线程停止运行时,应用程序将停止。

另外请注意,引用数并不是 GC 用来判断对象是否符合 GC 条件的。如果图不再可达,则保持相互引用的对象图(例如 DOM 树)可以符合 GC 条件。

关于Java 多线程 : Behaviour when Reference count of thread object becomes zero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11499750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com