Java 当对象持有对正在运行的线程的引用时,它是否有资格进行垃圾收集?
1) 事实上,问题在代码中。持有对正在运行的线程的引用是否会阻止对象符合垃圾收集的条件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
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将被声明为“私有静态类”。我想了解的是,运行线程的实例是否会阻止对象被收集?在该线程退出之前,它不会对该线程产生任何影响,甚至可能不会。看起来,我明白了。谢谢你的回复。