假设定义了一个局部变量,然后传递给 Thread 构造函数,在那里它被保存为该线程的私有字段。然后,线程开始连续运行(基本上是永远),而原始方法结束。局部变量引用没了,但是GC有没有考虑到Thread对象存储的引用?我的场景类似于这个示例片段:...public static void Main(String... args) { Foo foo = new Foo() MyThread thread = new MyThread(foo) ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(thread)}...public class MyThread implements Runnable { private Foo foo; public MyThread(Foo foo) { this.foo = foo; } public void run() { while (true) { this.foo.print(); // << throws NullPointerException sleep(...) } }}
1 回答
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
简而言之,是的,GC确实考虑了存储在MyThread
类中的引用,并且不会删除引用的对象。这是因为 Java 的垃圾收集器只会销毁无法访问的对象,即代码中任何地方都没有引用的对象(不完全是一般规则,请查看弱引用)。
该变量foo
不是一个实际的对象,而是对一个对象的引用。当您传递foo
到MyThread
的构造函数时,您不是在传递对象,而是对它的引用。在构造函数内部,您正在复制此引用并将其存储在MyThread
. 由于run()
该类的方法将“永远”运行(意味着 的实例MyThread
“活着”),有问题的引用将“永远”活着,从而防止被引用的对象被垃圾收集。
请注意,MyThread
's name 是错误的,可以这么说。它不会扩展Thread
,因此,它不是一个线程。它只是Runnable
接口的一个实现。更准确的名称是MyRunnable
.
添加回答
举报
0/150
提交
取消