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)
我运行了那段代码.似乎线程还活着.所有线程退出时程序结束.
我的问题:
otherThread.join()进入main()?我对自己有一些解释(但我不知道我是对的 - 我在这里发帖子的原因):
this引用,因此引用计数也不为零.我在上述任何解释中都是正确的吗?或者还有其他任何解释吗?
感谢致敬 :)
JB *_*zet 13
每个运行的线程构成GC的根.从其中一个根可访问的任何对象都不符合GC的条件,并且该线程具有对该java.lang.Thread实例的线程局部引用(返回者Thread.currentThread()).所以不,你的线程在结束运行之前不会被GC,因为Thread实例可以从正在运行的线程中访问.
我不明白为什么不调用join()生成的线程会是一件坏事.如果您不关心生成的线程何时结束,则无需加入它.当最后一个非守护程序线程停止运行时,应用程序将停止.
另请注意,引用的数量不是GC用于判断对象是否符合GC条件的数量.如果图形不再可达,则维护彼此引用的对象图(例如,DOM树)可以符合GC的条件.