java - 匿名可运行和内存泄漏

标签 java runnable anonymous-class

假设我们在一些静态类中有一些静态方法,它在单独的线程中运行一些操作(有一个可运行的)并由一些监听器返回结果:

public class SomeStaticClass {
private static ExecutorService mExecService = Executors.newCachedThreadPool();
........
public interface IDataLoadCompleteListener {

    public void onDataLoadComplete(Object result);

}
........

public static void getSomeData(final IDataLoadCompleteListener listener) {
    if (listener != null) {
        mExecService.execute(new Runnable() {
            @Override
            public void run() {
               ........
               do something
               ........
               Object result = new Object();
               listener.onDataLoadComplete(result);
            }
        });
    }
}
}

在其他类中我们调用方法 getSomeData():

public class SomeOtherClass {
private Object mResult;

public void someMethod(){

   SomeStaticClass.getSomeData(new IDataLoadCompleteListener(){

     @Override
     public void onDataLoadComplete(final Object result) {
        mResult = result;
     }

   });

}

}

所以在这种情况下,我想知道在 mExecService 中创建的匿名可运行对象何时可用于垃圾收集?此代码段中是否存在内存泄漏问题?在我看来,这个匿名 runnable 将存在很长时间,直到 SomeOtherClass 或其字段 mResult 垃圾被收集,因为我们在 runnable 中创建了一个对象并在 listener 中按引用传递,我说得对吗?

最佳答案

匿名类内存泄漏的问题正好相反。您创建的 IDataLoadCompleteListener 具有对外部类实例的隐式引用:在您的情况下为 SomeOtherClass。因此 SomeOtherClass 实例在收集监听器之前不能被垃圾收集。但在你的情况下似乎没问题。而Runnable则没有这样的问题,因为它是在static方法中创建的。因此,在您的 Runnable 执行后,它将有资格与匿名监听器一起进行 GC。您的情况不会造成内存泄漏。

关于java - 匿名可运行和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30814709/

相关文章:

java - 在Struts2中使用重定向结果类型时会发生404(从一个jsp重定向到另一个jsp)

java - 抽象类中的 XmlRootElement 注释 - 可能吗?

java - lambda 替换 Anonymous new Runnable() 是如何工作的?

java - 从匿名类访问参数

java - 覆盖具有通用返回类型的方法

java - Android 金融 API

ruby - 在父类(super class)的 self.inherited 中访问匿名类的名称

java - 私有(private)内部类合成了意外的匿名类

java - 如何终止由于Socket.accept()而被阻塞太长时间的线程?

Android:AsyncTask,我的第一个任务在另一个开始时还没有完成