博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在子线程和线程池中使用 ThreadLocal 传输上下文
阅读量:4292 次
发布时间:2019-05-27

本文共 970 字,大约阅读时间需要 3 分钟。

Java技术架构 2019-01-16 12:17:28

专注于Java领域优质技术号,欢迎关注

作者:晓_魂淡

问题举例

  • 在 Spring 框架中,使用 @Async 注解时,如何获取 ThreadLocal 中的数据?
  • 使用 CompletableFuture.supplyAsync 处理异步中,supplyAsync执行的方法如何获取 ThreadLocal 中的数据?
  • Executor 线程池中,如何获取 ThreadLocal 中的数据?

问题解决

Spring框架 @Async

  • 没有配置线程池,每执行一次都会创建新的线程处理,只需要使用 InheritableThreadLocal 即可获取。

如何在子线程和线程池中使用 ThreadLocal 传输上下文

 

  • 配置线程池,每次执行都会由线程池分配线程,使用 JDK 提供的 InheritableThreadLocal 无法获取到数据,而需要使用 Alibaba 扩展 InheritableThreadLocal 的 TransmittableThreadLocal。

maven pom 配置:

如何在子线程和线程池中使用 ThreadLocal 传输上下文

 

这只是配置线程池方式之一,这里不阐述太多,只是举例说明使用:

如何在子线程和线程池中使用 ThreadLocal 传输上下文

 

如何在子线程和线程池中使用 ThreadLocal 传输上下文

 

  • 把 InheritableThreadLocal 替换为 TTL 提供的 TransmittableThreadLocal
  • 使用 TTL 提供的 TtlExecutors 包装线程池对象

通过解决了 Spring @Async 注解的问题,即可举一反三,CompletableFuture.supplyAsync 和 Executor 亦可以在这两种方法处理。

线程池中传输必须配合 TransmittableThreadLocal 和 TtlExecutors 使用。

PS

  • ThreadLocal 不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。
  • 如果是当前线程中传输,只需要使用 ThreadLocal 即可。
  • TTL 源码解析:https://www.jianshu.com/p/aab6b1e7357d
  • TTL GitHub:https://github.com/alibaba/transmittable-thread-local

来源:https://www.jianshu.com/p/4093add7f2cd

 

转载地址:http://gszws.baihongyu.com/

你可能感兴趣的文章
期货市场技术分析02_趋势的基本概念
查看>>
期货市场技术分析03_主要反转形态
查看>>
期货市场技术分析04_持续形态
查看>>
期货市场技术分析05_交易量和持仓兴趣
查看>>
TB交易开拓者入门教程
查看>>
TB创建公式应用dll失败 请检查用户权限,终极解决方案
查看>>
python绘制k线图(蜡烛图)报错 No module named 'matplotlib.finance
查看>>
talib均线大全
查看>>
期货市场技术分析06_长期图表和商品指数
查看>>
期货市场技术分析07_摆动指数和相反意见理论
查看>>
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
X 分钟速成 Python
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
网格马丁格尔交易法
查看>>
TA-LIB 200多个技术指标含有及计算式
查看>>
一行代码让 Python 的运行速度提高100倍
查看>>
一行 Python 实现并行化 -- 日常多线程操作的新思路
查看>>
期货市场的运作机制
查看>>