热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java跨线程传递数据

Java跨线程传递数据应用场景解决思路代码分析JVM中工具阿里开源应用场景对于单服务来说,比如一个普通的商城的服务,有一个接口返回商品的信息࿰


Java跨线程传递数据

  • 应用场景
  • 解决思路
  • 代码分析
    • JVM中工具
    • 阿里开源


应用场景

     对于单服务来说,比如一个普通的商城的服务,有一个接口返回商品的信息,针对不同的国家/地区可能有不同的搜索结果,需要根据入参识别所属国家,并将这个国家信息传递到下游接口使用,我们首先会想到用Java中提供的threadlocal类来存储线程私有的变量,在入口处识别国家信息放入threadlocal,在后续的使用中直接从threadlocal中获取即可。(本质上是通过线程持有的threadlocalMap来区分不同的线程);
      此外,对于公司级别的链路追踪系统一般通过提供jar包的方式,使用方可以通过jar包中的方法来向上下文中放置数据,在应用内部和应用中进行传递。

     上述两个场景都面临同一个问题:如果处理过程中,使用了线程池/或者新建了子线程,threadlocal就不好用了。因为新建的子线程的threadlocalMap中并没有存储对应的值,当我们把一些参数存储在threadlocal中时,应用内部使用线程池执行任务或者重新创建线程的时候,新的线程就无法访问到原有线程持有的threadlocal数据,threadlocal变量中存储的内容会丢失,(也就是上下文信息需要从创建任务的时刻传递到run这个线程的时刻)。


解决思路

     线程之间的通信方式主要有两大类,一种是通过消息的方式通信,另一种是共享数据来通信。

     上面两种方法,无非是在创建新的线程/线程池进行调度的时候,想办法把threadlocal变量传递过去,既然是在服务内部,共享数据的方式更为合理。

也就是说在创建新的线程/线程池进行调度这两个时候,需要调用者将threadlcoal变量存储一下,同时被调用者需要读一下。


代码分析


JVM中工具

首先,JVM中提供了InheritableThreadLocal来解决父线程和子线程之间共享threadlocal变量的问题。类的注释如下:

This class extends <tt>ThreadLocal</tt> to provide inheritance of values
* from parent thread to child thread: when a child thread is created, the
* child receives initial values for all inheritable thread-local variables
* for which the parent has values. Normally the child&#39;s values will be
* identical to the parent&#39;s; however, the child&#39;s value can be made an
* arbitrary function of the parent&#39;s by overriding the <tt>childValue</tt>
* method in this class.

也就是说&#xff0c;如果变量声明为InheritableThreadLocal类型&#xff0c;保证在创建子线程的时候&#xff0c;就会将父线程的这些变量copy一下。
InheritableThreadLocal 继承自Threadlocal类&#xff0c;主要重写了三个方法&#xff0c;与threadlocal类中的createInheritedMap方法配合使用&#xff0c;在thread创建的时候判断父线程是不是有InheritableThreadLocal类型的变量&#xff0c;有的话则copy到子线程。
在这里插入图片描述
Thread 类中的init方法部分节选&#xff1a;
在这里插入图片描述
注意&#xff0c;InheritableThreadLocal 跨线程只适用于父线程/子线程之间的数据传递&#xff0c;对于线程池还是无能为力&#xff0c;还是需要封装出自己的runnable


阿里开源

阿里提供了一个开源的解决办法
https://github.com/alibaba/transmittable-thread-local
主要思想是&#xff1a;

Mythread thread &#61; new Mythread(runs,CopyThreadLocalToContext);## Run 的时候
Object backup&#61; setConextAndGetBackUp();
Run;
setBackup(backup);

除了这种对线程池进行显式包装的方式&#xff0c;还可以用java agent来对线程池进行增强&#xff0c;对代码没有入侵性


https://www.jianshu.com/p/a8f252d50d88



推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
爱在西元前2502938591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有