4

说(可能在单独的线程上)我正在运行一些方法 ClassA.foobar()。该方法内部是一个 try, (可能是 catch), finally 块。

现在,如果在执行仍在 try 块(或 catch 块)中间时丢失了对这个 ClassA 对象(或这个线程)的最后引用,那么这个对象(/线程)是否可以在我得到之前得到垃圾收集到finally块?换句话说:即使内存中没有对对象(/线程)的强引用,finally 块是否仍能保证运行?

(我不知道 GC 如何处理孤立的活动线程。)

虚拟示例:

[Some context]
{
    ClassA classA = new ClassA();
     //Point is this instance and a reference to it exists

    class ClassA
    {
        public void foobar()
        {
            try
            {
                classA = null;
                 //Point is that the last reference to this instance is lost,
                 //and that this happens at this point in foobar() execution.
                 //The actual location of this line of code is irrelevant.
            }
            finally
            {
                //some important stuff here!
            }
        }
    }
}
4

1 回答 1

6

换句话说:即使内存中没有对对象(/线程)的强引用,finally 块是否仍能保证运行?

是的。finally块不会像那样被跳过 - 任何其他代码也不会。

执行线程不是垃圾收集意义上的对象。区分线程本身和java.lang.Thread代表它的对象很重要——尽管我不认为Thread在线程终止之前对象会被垃圾收集。

特别是,完全有可能在系统中没有对可运行对象或其他任何东西的引用的线程,并且线程可以继续运行。例如:

new Thread(new Runnable() {
    @Override public void run() {
        for (int i = 0; i < 1000; i++) {
             System.out.println(i);
        }
    }
}).start();

线程启动后,调用代码没有对创建的匿名类的实例或Thread对象的引用——但它仍然会打印所有 1000 个数字。

于 2013-11-04T06:43:07.827 回答