You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步线程归属判定及父线程对象引用共享的技术问询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:35:20