例如在给定的代码中,
@Singleton
public class MyExecutor {
ExecutorService executorService;
public void execute(Runnable runnable) {
executorService.submit(runnable);
}
}
class A {
public void a(String x) {
// do something
}
MyExecutor executor;
// Injected via DI, always is same object
A(MyExecutor executor) {
this.executor = executor;
}
public void run() {
executor.execute(() -> a("Whatever"));
}
}
所以我的问题是假设我非常频繁地创建A
并调用它们的a.run()
,然后忘记了它,我的A
对象将直到{{ 1}}已完成对他们的处理?
在我看来应该是这样,否则MyExecutor
将如何知道要执行哪个实例?
所以基本上我的问题是,传递实例方法引用为MyExecutor
/ Runnable
/ Callable
的调用方对象是否对GC安全,直到传递的{{1} } / Consumer
/ Runnable
有人提到他们吗?
答案 0 :(得分:1)
好的。
这很简单:只要“活动”对象保留对其他对象X的引用,其他对象X就不适合进行垃圾收集。
可以安全地假设执行者跟踪提交给它的所有任务。任务完成后,不再需要对传递给它的任务/可运行文件的任何引用。因此执行者忘记了它,然后然后认为该任务/可运行程序有资格使用GC。
请注意:没有“方法参考”对象!方法引用或lambda基本是某种类的对象(Task或Runnable,例如,取决于上下文)。方法引用首先是一个 syntax 元素!