https://cloud.tencent.com/developer/article/1798224

前言

在做分布式链路追踪系统的时候,需要解决异步调用透传上下文的需求,特别是传递traceId,本文就线程池透传几种方式进行分析。

其他典型场景例子:

  1. 分布式跟踪系统 或 全链路压测(即链路打标)
  2. 日志收集记录系统上下文
  3. SessionCache
  4. 应用容器或上层框架跨应用代码给下层SDK传递信息

1、JDK对跨线程传递ThreadLocal的支持

首先看一个最简单场景,也是一个错误的例子。

void testThreadLocal(){
    ThreadLocal<Object> threadLocal = new ThreadLocal<>();
    threadLocal.set("not ok");
    new Thread(()->{
        System.out.println(threadLocal.get());
    }).start();
}

java中的threadlocal,是绑定在线程上的。你在一个线程中set的值,在另外一个线程是拿不到的。

上面的输出是:

null