首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传播threadLocal变量

传播threadLocal变量
EN

Stack Overflow用户
提问于 2022-10-31 18:30:41
回答 1查看 27关注 0票数 0

我正在探讨这个特定的问题,我想知道是否有人遇到过这个问题。我有一个方法: methodA() -这将创建一个名为"temp“的ThreadLocal,如果它不存在,如果ThreadLocal存在,它将返回该ThreadLocal变量(在这个场景中,IE:"temp”)

基本上,我遇到的场景是:我调用methodA() -(我创建了ThreadLocal变量"old_temp"),然后调用该方法:

CompletableFuture.supplyAsync( () ) ->{ThreadContext.put("RequestId",requestId);methodB();},iotaInvokerService).handleAsync(methodC();methodB()来自另一个团队的库,methodB()调用methodA()。

当methodB()调用methodA()时,我希望methodA()返回最初在第一次调用methodA()时创建的ThreadLocal变量"old_temp“。但是,当methodB()调用methodA()而不是返回"old_temp“ThreadLocal变量时,它会创建一个全新的ThreadLocal变量,我不想使用这个变量。当methodB()调用methodA()时,我希望它返回"old_temp“。有人能帮我解决这个问题吗?

我相信,当用一个CompletableFuture.supplyAsync调用executorService时,它会创建一个ThreadLocal变量上下文不传递给它的新线程,这似乎就是问题所在。

我看到了将ThreadLocal传播到从ExecutorService获取的新线程,但我仍然不确定/仍然不清楚如何将它应用到我的场景中。我认为问题是,我知道什么是ThreadLocal变量--这是我想要的,但我不太确定。

EN

回答 1

Stack Overflow用户

发布于 2022-10-31 18:51:03

ThreadLocal提供线程局部变量,因为每个访问一个线程的线程(通过其get或set方法)都有自己的、独立初始化的变量副本。如果一个计算是由一个线程启动并由另一个线程继续进行的,那么使用ThreadLocal接缝是不合适的。

如果您依赖像工程堆这样的库,那么您可以使用自动传播的上下文 .

另一种选择是使用全局值(或允许访问.的单例)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74267705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档