线程池公用变量

一般情况下,我们定义线程变量是使用ThreadLocal

private final ThreadLocal<DmeRequestContextInfo> LOCAL_DATA = new ThreadLocal<>();

但这样线程池里不能公用这个变量,需要使用 TransmittableThreadLocal

private final ThreadLocal<DmeRequestContextInfo> LOCAL_DATA = new TransmittableThreadLocal<>();

TransmittableThreadLocal(TTL)是阿里巴巴开源的一个线程本地变量(ThreadLocal)增强工具,用于解决 ​​线程池环境下 ThreadLocal 变量传递丢失​​ 的问题。它是对 Java 原生 ThreadLocal 的增强,适用于 ​​线程池任务执行​​ 场景。

注意 TransmittableThreadLocal 的作用​​:
它的作用是 ​​在多线程环境下(如线程池)传递 ThreadLocal 变量​​。
但前提是 ​​任务必须被 TtlRunnable 或 TtlCallable 包装​​,否则变量无法传递。

错误示例

for (PatrolInspectPlan item : dataList) {
    orderThreadPoolExecutor.execute(() -> {
      xxxx
    });
}

正确示例

for (PatrolInspectPlan item : dataList) {
 // 使用 TtlRunnable 包装任务,确保变量传递
 orderThreadPoolExecutor.execute(TtlRunnable.get(() -> {
     xxxx
 }));
}

你可能感兴趣的:(JAVA,java)