Java多线程:线程对象的引用计数变为零时的行为

Ult*_*nct 4 java multithreading garbage-collection reference-counting

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

我正在学习Java,下面的场景让我头疼:

class MyThread extends Thread {
    void run(){
        //a heavy function
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在主线程中,我将此线程调用为:

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.
}
Run Code Online (Sandbox Code Playgroud)

我运行了那段代码.似乎线程还活着.所有线程退出时程序结束.

我的问题:

  • 当引用计数为零时,该线程是否符合GC的条件?如果真的符合条件,那么垃圾收集的行为是什么?线程会被终止吗?
  • 我知道这是一件坏事,但它是否已被定义为无法otherThread.join()进入main()?

我对自己有一些解释(但我不知道我是对的 - 我在这里发帖子的原因):

  • 只要JVM 处于活动状态, JVM就会保留对该线程的引用.因此引用计数永远不会为零.
  • 执行函数具有隐式this引用,因此引用计数也不为零.

我在上述任何解释中都是正确的吗?或者还有其他任何解释吗?

感谢致敬 :)

JB *_*zet 13

每个运行的线程构成GC的根.从其中一个根可访问的任何对象都不符合GC的条件,并且该线程具有对该java.lang.Thread实例的线程局部引用(返回者Thread.currentThread()).所以不,你的线程在结束运行之前不会被GC,因为Thread实例可以从正在运行的线程中访问.

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

另请注意,引用的数量不是GC用于判断对象是否符合GC条件的数量.如果图形不再可达,则维护彼此引用的对象图(例如,DOM树)可以符合GC的条件.