TransmittableThreadLocal简述和使用demo

110 篇文章 1 订阅
4 篇文章 0 订阅

概述

业务中经常会遇到多线程之间的上下文传递,比如自己开启子线程异步执行,或者使用线程池异步执行时,需要把token/request上下文传递.

手写的话,在创建子线程时需要自己包裹一下;
在使用线程池时需要对execute方法进行包裹,比如springThreadPoolTaskExecutor中的TaskDecorator.

com.alibaba.ttl.TransmittableThreadLocal就帮我们做好了这个包裹过程,称为装饰更合适一点。
需要引入maven依赖;我当前用的是2.14.2的版本

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

TransmittableThreadLocal

java.lang.InheritableThreadLocal的子类,对线程变量copy的时机做了调整,

java.lang.InheritableThreadLocal是在new的时候将调用线程的threadLocals线程内容copyinheritableThreadLocals中.

TransmittableThreadLocal则是在run的时候才去copy调用线程的内容(copy的时候会返回调用线程的信息),并且会在调用结束后,将调用线程的内容重新塞回去

为什么要再塞回去,我想的是考虑了调用线程池时,策略为java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy#CallerRunsPolicy时,线程池满了交由调用线程执行时,此时线程执行内容中修改了threadLocals后对调用线程造成干扰。

在这里插入图片描述

使用demo

//只需要包裹一下即可
com.alibaba.ttl.TtlRunnable.get(java.lang.Runnable, boolean)
ttlRunnable.run();


//也可以包裹线程池Executors,其实内部在execute时也还是用的 TtlRunnable.get
ExecutorService ttlExecutorService = TtlExecutors.getTtlExecutorService(Executors.newFixedThreadPool(1));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值