异步线程归属判定及父线程对象引用共享的技术问询
MyObject obj; obj.setName("main_Thread"); Executor executor = asyncExecutorConfig.getAsyncExecutor(); CompletableFuture.runAsync(() -> { try { obj.setName("Async_Thread");//Async can access obj?? } catch (Exception e) { e.printStackTrace(); } }, executor); Thread.sleep(20000); //to let Async thread run // 此时obj.getName()返回"Async_Thread"
问题解答
1. Async thread是否属于子线程?
属于子线程。你通过CompletableFuture.runAsync()提交的任务,最终由指定executor管理的线程执行,这些线程是独立于主线程的子线程,与主线程并行执行。
2. 主线程的局部变量obj,异步线程如何获取相同引用?
这是Java Lambda表达式的变量捕获机制在起作用:
obj是主线程的局部变量,且它的引用未被重新赋值(仅修改对象内部属性),属于**有效不可变(effectively final)**变量;- Lambda表达式创建时会捕获
obj的对象引用,并将该引用传递给异步执行的任务; - 异步线程拿到的是和主线程完全相同的对象引用,指向堆内存中同一个
MyObject实例,因此修改实例属性会直接反映到主线程的obj上。
内容的提问来源于stack exchange,提问作者Abe
相关产品推荐
相关产品推荐

