假设我创建了这个Test
类的实例,该实例使用嵌套类启动一个新的Thread:
public class Test
{
private String _str;
public Test()
{
_str = "Hello world !";
new TestThread().start(); // Start a background thread
}
private class TestThread extends Thread
{
public void run()
{
while (true)
{
System.out.println(_str);
Thread.sleep(1000);
}
}
}
}
如果删除对
Test
实例的任何强引用,现在会发生什么?后台线程仍将保持活动状态,并将继续打印_str
变量,但是恐怕GC可以随时收集它。当然,我可以创建引用的本地副本(使用构造函数:
public TestThread(String str)
并将其存储在本地变量中),但是我想知道这是否有必要。 最佳答案
TestThread
本身对Test
有很强的引用,因此,只要它不可收集,就不能收集Test
实例。由于它是一个正在运行的线程,因此TestThread
的实例显然不可用于收集。
当您创建一个非静态内部类(TestThread)时,该类的每个实例都有对其隐式类(Test)实例的隐式引用。
请参见Nested Classes Java Tutorial的内部类部分。
您不必“害怕” GC会做什么。除非您不愿意使用弱引用,否则它将不会收集您可能引用的对象。