Java 当对象持有对正在运行的线程的引用时,它是否有资格进行垃圾收集?

Java 当对象持有对正在运行的线程的引用时,它是否有资格进行垃圾收集?,java,multithreading,garbage-collection,weak-references,Java,Multithreading,Garbage Collection,Weak References,1) 事实上,问题在代码中。持有对正在运行的线程的引用是否会阻止对象符合垃圾收集的条件 class SomeClass { Thread mThread = new Thread(new MyRunnable()); public SomeClass() { mThread.start(); } public static void main(String[] args) { SomeClass sc = new SomeC

1) 事实上,问题在代码中。持有对正在运行的线程的引用是否会阻止对象符合垃圾收集的条件

class SomeClass {

    Thread mThread = new Thread(new MyRunnable());

    public SomeClass() {
        mThread.start();
    } 

    public static void main(String[] args) {
        SomeClass sc = new SomeClass();
        sc = null;
        // Will the sc be eligible to gc here?
        ...
    }

    private static class MyRunnable implements Runnable {
        @Override
        public void run() {
            while (true) {} 
        }
    }
}
2) 如果我们使用WeakReference来代替Thread,它是否符合条件

已更新

更新代码以强调最困扰我的问题


我试图理解的是,运行线程的实例是否会阻止对象被收集?

符合垃圾收集的条件是谁持有对您的引用,而不是您持有对谁的引用。因此,是的,如果一个对象的实例变量包含对正在运行的
线程的引用,而该对象本身无法从任何活动线程访问,则该对象可以进行垃圾收集。事实上,在您的示例中,在您标记的行中就是这种情况

如果收集了这样一个对象,这将不会对所讨论的线程产生任何影响。特别是,VM本身持有对每个活动
线程的引用(即使它当前未运行),因此不需要对
线程的其他引用来阻止它被收集


当然,持有对线程的弱引用也不能防止对象被垃圾收集。

该代码实际上并没有启动线程。但是我相信实际上是匿名的
Runnable
子类保存了对
SomeClass
的引用,线程保存了对Runnable的引用。它在构造函数中启动线程。啊,你刚才添加的构造函数:)是:)。并且如果Runnable将被声明为“私有静态类”。我想了解的是,运行线程的实例是否会阻止对象被收集?在该线程退出之前,它不会对该线程产生任何影响,甚至可能不会。看起来,我明白了。谢谢你的回复。