子线程如何获取父线程ThreadLocal的值

京东一面:子线程如何获取父线程ThreadLocal的值 子线程如何获取父线程ThreadLocal的值 最近微信群里一个网友分享了他京东一面的过程,我这里分享给大家其中一道面试题。 京东一面」子线程如何获取父线程ThreadLocal的值 子线程如何获取父线程ThreadLocal的值 图片 想要子线程获取父线程中 ThreadLocal 中的值,需要其子类 InheritableThreadLocal 实现。 测试代码如下: public static void main(String[] args) throws Interrupt 阅读详情

不卖关子,用InheritableThreadLocal。
关于ThreadLocal可以参考我的另一篇文章
ThreadLocal使用及原理_编程还未的博客-优快云博客

ThreadLocal实战源码在文末。

1.使用

直接上代码。

public class InheritableThreadLocalTest1 {

    public static void main(String[] args) {
        ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
        threadLocal.set(1);
        InheritableThreadLocal<Integer> inheritableThreadLocal = new InheritableThreadLocal<>();
        inheritableThreadLocal.set(2);
        new Thread(() -> {
            System.out.println("threadLocal=" + threadLocal.get());
            //debug到这一行看源码
            System.out.println("inheritableThreadLocal=" + inheritableThreadLocal.get());
        }).start();
    }
}

运行结果

threadLocal=null
inheritableThreadLocal=2

2.原理

Thread类里面有两个ThreadLocal对象,一个是threadLocals(ThreadLocal对象),一个是inheritableThreadLocals(InheritableThreadLocal对象)。

    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

    /*
     * InheritableThreadLocal values pertaining to this thread. This map is
     * maintained by the InheritableThreadLocal class.
     */
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;

默认的new Thread()会获取parent线程的inheritableThreadLocals,并赋值。

public Thread(Runnable target) {
        this(null, target, "Thread-" + nextThreadNum(), 0);
}
public Thread(ThreadGroup group, Runnable target, String name,
                  long stackSize) {
       this(group, target, name, stackSize, null, true);
}
/**
*精简后的代码
*/
private Thread(ThreadGroup g, Runnable target, String name,
                   long stackSize, AccessControlContext acc,
                   boolean inheritThreadLocals) {

        Thread parent = currentThread();
       
        if (inheritThreadLocals && parent.inheritableThreadLocals != null)
            this.inheritableThreadLocals =
                ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
 
    }

InheritableThreadLocal本身也比较简单。主要是getMap()、createMap()的时候操作的是Thread的inheritableThreadLocals

public class InheritableThreadLocal<T> extends ThreadLocal<T> {
 
    public InheritableThreadLocal() {}

    protected T childValue(T parentValue) {
        return parentValue;
    }

    ThreadLocalMap getMap(Thread t) {
       return t.inheritableThreadLocals;
    }

    void createMap(Thread t, T firstValue) {
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
    }
}

3.实战源码

具体的介绍,已经在我的博文,ThreadLocal使用及原理_编程还未的博客-优快云博客,介绍过了。

ThreadLocal实战,源码地址:highway-resources: threadlocal-current-user

关注公众号- 编程highway - 获取更多好文和学习资料

腾讯云运维工程师认证TCA--真题(最新2022.11) 解析:云原生应用的12要素,1.基准代码:一份基准代码,多份部署;解析:腾讯云主账号具备对其名下资源(包括存储桶)的最大权限,您虽然可以在存储桶策略中限制几乎所有操作,但主账号始终具备 PUT Bucket Policy 操作的权限,主账号调用该操作不检查存储桶策略。解析:瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。解答:云原生五大关键技术:微服务、容器化、DevOps、持续交付。 阅读详情

相关推荐

UG/NX二次开发实例流程样例(nx1980+vs2019)

以上就是基本操作了,下面进入界面开发流程,nx1980的界面开发操作,也需要在块UI界面编辑器中操作,很多教程都没有讲解这一点,尤其是如何进入块UI界面编辑器,那么我在这里详细说明一下步骤。》,这一篇文章我们将详细讲述,如何开发一个具体的功能——根据用户输入的数据,在特定的点上创建一个指定大小的立方体。可以将文件保存当桌面,笔者保存在桌面的create_block目录中了,如下图所示,可以发现生成了三个文件。4.在新建模型完成后,我们准备创建交互UI,按照下图所示的顺序,找到块UI界面编辑器,。

秋月的私语 1万+

【Java】子线程获取父线程ThreadLocal

阅读这篇博客前,请确保你对ThreadLocal的使用场景和实现原理有一定了解。【Java】ThreadLocal原理与使用场景-优快云博客。本文主要聚焦于ThreadLocal在父子线程间传递的原理。

Annancqxxx的博客 2465

DINOv3实战指南:如何利用零样本视觉模型革新工业质检

本文详细介绍了如何利用DINOv3零样本视觉模型革新工业质检流程。通过无需标注数据的自监督学习技术,DINOv3能快速部署高精度检测系统,显著降低成本和提升效率。文章涵盖模型选型、数据准备、实时检测优化及典型行业解决方案,为工业质检提供革命性AI实践指南。

ansible6ops的博客 121

如何在子线程拿到父线程threadLocal的值

ThreadLocal父子线程数据传递 (面试题:如何在子线程拿到父线程threadLocal的值) 1、演示子线程无法拿到值 /** * 直接使用ThreadLocal,无法获得父线程的值 */ public static void demo1() { ThreadLocal<String> stringThreadLocal = new ThreadLocal<>(); stringThreadLocal.set

weixin_44637711的博客 2116

RSA 2048/4096 签名校验算法

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能...

qq_38769551的博客 9495

【花雕学编程】Arduino FOC 之AS5048A磁编码器模块

您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。

雕爷学编程 1496

如何获取子线程的执行结果

前言 博主以前面试的时候,真真切切的被问过这样一道题: 如何获取子线程的执行结果? 总所周知,在单线程情况下,想获取线程执行结果很简单,只需要写类似的代码即可: Object result = xxx.getXxx(); 但是在多线程的情况下,想要获取子线程的执行结果,恐怕就没这么简单了。 剑走偏锋 我们都知道开启一个新线程的方式有两种:继承Thread类、实现Runnable接口。可是这两...

Sicimike的博客 5889

【Go语言实战】(3) Gin + Gorm 简单备忘录 | 含接口文档

Go语言实战:TodoList 备忘录

面向生活编程 6139

java第七章多线程_Java OOP——第七章 多线程

1、进程:是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间);Eg:用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击左面的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。目前操作系统都支持多进程。◆注;用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间。◆进程的特点:进程是系统运行程序的基本单位;...

weixin_39598568的博客 440

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3236

卫星轨道坐标转换:轨道六根数到经纬高(经STK验证)

a:半长轴(km)e:偏心率i:轨道倾角(度)Ω:升交点赤经(度)ω:近地点幅角(度)ν:真近点角(度)

weixin_52370774的博客 169

在父线程中设置的ThreadLocal变量,怎样在子线程中获取?

首先我们看一个例子 public class TestThreadLocal { public static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main( String[] args ) { // 色后置线程变量 threadLocal.set("hello world"); Thread thread

半夏_2021的博客 3127

2026年中科曙光嵌入式笔试试卷带答案

2026年中科曙光嵌入式笔试试卷涵盖数字电路、总线协议、时序分析、存储原理及硬件寄存器操作等核心知识点。单选题聚焦SPI/I2C差异、建立/保持时间、ADC作用等基础概念;多选题考察时序约束、非易失存储、BMC功能等综合应用;判断题强化对关键术语的理解;填空题考查基本术语记忆;简答题要求掌握SPI与I2C对比、时序违例后果及BMC管理机制。试题紧扣嵌入式系统开发实际,突出接口协议、时序设计与硬件交互能力,是嵌入式岗位选拔的重要依据。

Open 21

子线程如何获取父线程ThreadLocal的值?

Java中如果子线程要获取到父线程中 ThreadLocal 中的值,需要使用其子类InheritableThreadLocal 实现。 测试代码如下: public class Get_ThreadLocal { public static void main(String[] args) throws InterruptedException { Thread parentParent = new Thread(() -> { ...

Android系统优化 4408

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

获取父线程 java_java子线程中获取父线程的threadLocal中的值

一、java子线程中获取父线程的threadLocal中的值threadLocal可以做线程级的数据隔离,那如何在子线程中获取父线程的值呢? 可以使用InheritableThreadLocal/*** Java子线程获取父线程的threadLocal中的值*/public class ThreadDemo1 {public static final InheritableThreadLoca...

weixin_39617113的博客 175

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java获取当前线程的父线程_java子线程中获取父线程的threadLocal中的值

一、java子线程中获取父线程的threadLocal中的值threadLocal可以做线程级的数据隔离,那如何在子线程中获取父线程的值呢? 可以使用InheritableThreadLocal/*** Java子线程获取父线程的threadLocal中的值*/public class ThreadDemo1 {public static final InheritableThreadLoca...

weixin_36009861的博客 1254

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

子线程如何获取父线程 ThreadLocal 的值

点击下方“IT牧场”,选择“设为星标”blog.youkuaiyun.com/weixin_44912855最近微信群里一个网友分享了他京东一面的过程,我这里分享给大家其中一道面试题。京东一面」子线程如何获取父线程ThreadLocal的值子线程如何获取父线程ThreadLocal的值想要子线程获取父线程中 ThreadLocal 中的值,需要其子类 InheritableThrea...

ITMuch的专栏 3105

java怎么在action获取线程_java子线程中获取父线程的threadLocal中的值

一、java子线程中获取父线程的threadLocal中的值threadLocal可以做线程级的数据隔离,那如何在子线程中获取父线程的值呢? 可以使用InheritableThreadLocal/*** Java子线程获取父线程的threadLocal中的值*/public class ThreadDemo1 {public static final InheritableThreadLoca...

weixin_39606911的博客 283

如何让子线程获取到父线程的ThreadLocal中的值

代码demo如下: public static void main(String[] args) throws InterruptedException { Thread parentParent = new Thread(new Runnable() { @Override public void run() { ThreadLocal threadLocal = new ThreadLocal(); threadLo

硅脂味咖啡的博客 2903

子线程获取父线程 ThreadLocal 的值

子线程获取父线程 ThreadLocal 的值

wangzheQQ的博客 218

java子线程中获取父线程的threadLocal中的值

我们都知道线程本地变量表也就是ThreadLocal在我们做线程级的数据隔离时非常好用,但是有时候我们会想如何让子线程获取到父线程的ThreadLocal,其实在线程中除了ThreadLocal外还有InheritableThreadLocal,顾名思义,可继承的线程变量表,可以让子线程获取到父线程中ThreadLocal的值。如果允许new的线程继承当前线程的threadlocalMap,那么new的线程会copy一份当前线程也就是父线程的inheritableThreadLocals。

yygr的博客 1442
上一篇: ThreadLocal使用及原理
下一篇: Linux服务器中了挖矿的病毒,成功清理
编程还未
博客等级 码龄5年 4293粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程还未

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值