垃圾收集和异步调用/ Future对象

Ant*_*Dev 7 java multithreading

下面是一个使用Future接口进行异步调用的示例代码.我需要对get()方法做一些澄清.

Future<String> future = getAsyncString();
//do something ...
String msg = "";
if (validation)
    return;
else
    msg = future.get();
//do something else...
return;
Run Code Online (Sandbox Code Playgroud)

将来的变量在方法中初始化,因此在方法执行后GC将很快清除该变量,因为它不再使用.因此,如果代码进入if语句,那么JVM的状态是什么?如果没人会读回来,JVM将如何处理包装结果?它会影响线程池还是线程Executor?

aio*_*obe 10

如果没人会读回来,JVM将如何处理包装结果?

据推测,你得到了一个Future物体Executor.为了使这个执行器能够在其中设置结果Future,它保存了对的引用Future.换句话说,仅仅因为弹出调用堆栈时对该对象的方法本地引用消失,并不意味着该Future对象(在堆上)自动符合垃圾回收的条件.

异步调用未被取消或类似的东西.执行程序将执行调用,填写结果,并可能删除它对Future对象的引用.在这个点的对象不可达,符合垃圾回收.

如果您确定您的代码没有保留对该Future对象的引用(即将其泄漏到该// do something...部件中),那么您可以确保该Future对象(最终)由GC收集.(执行程序在这里没有任何微妙的内存泄漏.)

[...]因此GC很快就会清除变量.

确切地说,在弹出调用堆栈时,将丢弃该变量.这最终将导致Future 对象无法访问并且有资格进行垃圾回收.但是,当方法返回时,通常不会立即对对象进行垃圾回收.


Nam*_*ala 3

如果没有人读回 JVM 将如何处理包装的结果?

如果没有人(我的意思是任何程序)会读回它,那么 GC 将在垃圾收集期间处理它。但这并不意味着getAsyncString()不会完全执行,而是会像正常方法一样正常完成。