当前位置: 首页 > news >正文

有了InheritableThreadLocal为啥还需要TransmittableThreadLocal?

有了InheritableThreadLocal为啥还需要TransmittableThreadLocal?

典型回答

InheritableThreadLocal是用于主子线程之间参数传递的,但是,这种方式有一个问题,那就是必须要是在主线程中手动创建的子线程才可以,而现在池化技术非常普遍了,很多时候线程都是通过线程池进行创建和复用的,这时候InheritableThreadLocal就不行了。 TransmittableThreadLocal是阿里开源的一个方案 (开源地址) ,这个类继承并加强InheritableThreadLocal类。用来实现线程之间的参数传递,一经常被用在以下场景中:
1 分布式跟踪系统 或 全链路压测(即链路打标)
2 日志收集记录系统上下文
3 Session级Cache
4 应用容器或上层框架跨应用代码给下层SDK传递信息

使用方式

先需要导入依赖:

<dependency> <groupId>com.alibaba</groupId> <artifactId>transmittable-thread-local</artifactId><version>2.14.2</version>
</dependency>

对于简单的父子线程之间参数传递,可以用以下方式:

TransmittableThreadLocal<String> context = new TransmittableThreadLocal<>();
// 在父线程中设置 
context.set("value-set-in-parent"); 
// 在子线程中可以读取,值是"value-set-in-parent" 
String value = context.get();

如果在线程池中,可以用如下方式使用:

TransmittableThreadLocal<String> context = new TransmittableThreadLocal<>(); // 在父线程中设置
context.set("value-set-in-parent");
Runnable task = new RunnableTask();// 额外的处理,生成修饰了的对象
ttlRunnable Runnable ttlRunnable = TtlRunnable.get(task);
executorService.submit(ttlRunnable);// Task中可以读取,值是"value-set-in-parent"
String value = context.get();

除了Runnable,Callable也支持:

TransmittableThreadLocal<String> context = new TransmittableThreadLocal<>();
// 在父线程中设置 context.set("value-set-in-parent");
Callable call = new CallableTask();
// 额外的处理,生成修饰了的对象
ttlCallable Callable ttlCallable = TtlCallable.get(call);
executorService.submit(ttlCallable);
// Call中可以读取,值是"value-set-in-parent"

也可以直接用在线程池上,而不是Runnable和Callable上:

ExecutorService executorService = ...
// 额外的处理,生成修饰了的对象
executorService executorService = TtlExecutors.getTtlExecutorService(executorService); 
TransmittableThreadLocal<String> context = new TransmittableThreadLocal<>(); 
// 在父线程中设置 context.set("value-set-in-parent");
Runnable task = new RunnableTask();
Callable call = new CallableTask();
executorService.submit(task);
executorService.submit(call);
// Task或是Call中可以读取,值是"value-set-in-parent" String value = context.get();
http://www.lryc.cn/news/208157.html

相关文章:

  • 结构伪类选择器
  • java-- 静态数组
  • 世界经济论坛:ChatGPT等生成式AI,对全球23%岗位产生巨大影响
  • myTracks for Mac:GPS轨迹记录器的强大与便捷
  • Macos视频增强修复工具:Topaz Video AI for mac
  • 如何在IDEA中配置指定JDK版本?轻松解决!!!
  • 思维导图软件 ConceptDraw MINDMAP mac中文特色介绍
  • PDF编辑工具Acrobat Pro DC 2023中文
  • 如何开通 Medium会员
  • CDN是如何一步步壮大到现在这样的
  • 【Java】电子病历编辑器源码(云端SaaS服务)
  • 解决netty作为web,post请求体过大导致413 Request Entity Too Largew问题
  • 【Linux】rpm和yum的使用
  • 贪心算法学习——最大数
  • next项目部署到云服务器上(手动)
  • CG Magic分享3dmax软件安装与打开文件转圈圈怎么办?
  • 京东(天猫)数据分析:2023下半年茶饮料市场高速增长,东方树叶一骑绝尘
  • 软件测试之【单元测试、系统测试、集成测试】
  • 安装 tensorflow==1.15.2 遇见的问题
  • OJ刷题 第十八篇(递归篇)
  • 互联网产品说明书指南,附撰写流程与方法
  • 从JVM方面解释java传递问题
  • Oracle查询用户所有表的语句
  • Python轮廓追踪【OpenCV形态学操作】
  • 安全狗安装
  • HTTP发起请求与收到响应的大致过程
  • c++继承的小细节
  • 【分享】7-Zip压缩包的密码可以取消吗?
  • learning rate
  • 小型气象站数据采集网关准确监测雨量和风速