假设我创建了这个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会做什么。除非您不愿意使用弱引用,否则它将不会收集您可能引用的对象。

10-08 05:09