【发布时间】:2015-06-13 11:35:19
【问题描述】:
假设我们在某个静态类中有一个静态方法,它在单独的线程中运行一些操作(有一个可运行的)并通过某个侦听器返回结果:
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 中创建的匿名可运行文件何时可用于垃圾收集?这个 sn-p 是否存在一些内存泄漏问题?在我看来,这个匿名可运行对象将存在很长时间,直到 SomeOtherClass 或其字段 mResult 被垃圾回收,因为我们在可运行对象中创建了一个对象并在侦听器中通过引用传递,对吗?
【问题讨论】:
-
runnable 引用了 someOtherClass;但不是相反。
-
一旦 Runnable 完成了它的动作,如何到达它?对象不关心它是在哪里创建的,例如在可运行对象中创建的对象。重要的是对象是否可达,如果不可达,是否有资格进行垃圾回收。
标签: java runnable anonymous-class