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
对象无法访问并且有资格进行垃圾回收.但是,当方法返回时,通常不会立即对对象进行垃圾回收.
如果没有人读回 JVM 将如何处理包装的结果?
如果没有人(我的意思是任何程序)会读回它,那么 GC 将在垃圾收集期间处理它。但这并不意味着getAsyncString()
不会完全执行,而是会像正常方法一样正常完成。
归档时间: |
|
查看次数: |
1626 次 |
最近记录: |