一、InheritableThreadLocal的不足
InheritableThreadLocal可以用于主子线程之间传递参数,但是它必须要求在主线程中手动创建的子线程才可以获取到主线程设置的参数,不能够通过线程池的方式调用。
但是现在我们实际的项目开发中,一般都是采用线程池的,这时候InheritableThreadLocal就有点不够用了。
所以TransmittableThreadLocal就出场了。
二、TransmittableThreadLocal - 在线程池中传递获取参数
TransmittableThreadLocal是阿里开源的一个方案。
开源地址:https://github.com/alibaba/transmittable-thread-local
这个类继承并加强了InheritableThreadLocal。经常被用在一下场景中:
- 分布式跟踪系统或全链路压测(链路打标)
- 日志收集系统上下文
- 应用容器或上层框架夸应用代码给下层SDK传递信息
下面通过一个代码示例来验证和查看TransmittableThreadLocal是如何将主线程中的参数传递到线程池中的:
public class TransmittableThreadLocalTest {
static ExecutorService threadPool = Executors.newFixedThreadPool(10);
static TransmittableThreadLocal<String> transmittableThreadLocal = new TransmittableThreadLocal<>();
public static void main(String[] args) {
transmittableThreadLocal.set("test");
threadPool.execute(()-> {
System.out.println("result= " + transmittableThreadLocal.get());
});
}
}
从打印的结果可以看到,线程池中的线程是可以成功获取到main线程中通过TransmittableThreadLocal设置的参数test的值的。