当前位置: 首页 > 后端技术 > Java

京东端:子线程如何获取父线程ThreadLocal的值?我很困惑,..

时间:2023-04-02 09:58:52 Java

来源:blog.csdn.net/weixin_44912855近日,微信群里有网友分享了自己面试京东的过程。在这里,我将与您分享其中一个面试问题。京东一侧》子线程如何获取父线程ThreadLocal的值子线程如何获取父线程ThreadLocal的值如果子线程获取父线程ThreadLocal中的值,其子类InheritableThreadLocal需要予以实施。测试代码如下:publicstaticvoidmain(String[]args)throwsInterruptedException{ThreadparentParent=newThread(()->{ThreadLocalthreadLocal=newThreadLocal<>();threadLocal.set(1);InheritableThreadLocalinheritableThreadLocal=newInheritableThreadLocal<>();inheritableThreadLocal.set(2);newThread(()->{System.out.println("threadLocal="+threadLocal.get());System.out.println("inheritableThreadLocal="+inheritableThreadLocal.get());}).start();},"父线程");parentParent.start();}运行结果如下:子线程在父线程中获取ThreadLocal中的值。原理如下:首先我们要知道,Thread类维护了两个ThreadLocalMaps来跟进newThread()方法。它的构造方法调用了init方法,init方法将inheritThreadLocals的值设置为true继续后续。当inheritThreadLocals的值为true且父线程的inheritableThreadLocals不为null时,将父线程的inheritableThreadLocals赋值给当前线程的inheritableThreadLocals。这是子线程获取父线程ThreadLocal值的关键。继续跟进,看看InheritableThreadLocal的get()方法。get()方法没什么好看的,就是ThreadLocal的get()方法。注意:InheritableThreadLocal重写了ThreadLocal的getMap()方法ThreadLocalMapgetMap(Threadt){//获取线程自身的变量threadLocals,绑定到当前调用线程的成员变量threadLocals上returnt.threadLocals;}voidcreateMap(Threadt,TfirstValue){t.threadLocals=newThreadLocalMap(this,firstValue);//创建ThreadLocalMap的table属性并赋值,将firstValue放在数组的最前面。}createMap方法不仅创建了threadLocals,还将要添加的局部变量的值添加到threadLocals中。InheritableThreadLocal类继承了ThreadLocal类,并重写了childValue、getMap、createMap方法。当调用createMap方法时,它会创建inheritableThreadLocal而不是threadLocals。同理,当前调用线程调用get方法时,getMap方法返回的不是threadLocals,而是inheritableThreadLocal。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!