TransmittableThreadLocal & InheritableThreadLocal
InheritableThreadLocal类是ThreadLocal类的一个子类,它提供了一个线程局部变量,该变量的值可以被当前线程以及所有子线程共享。这在多线程编程中非常有用,特别是在需要在父线程和子线程之间传递数据时。 下面是一个简单的Java代码示例,演示了InheritableThreadLocal的用法:
public class InheritableThreadLocalExample { // 创建一个InheritableThreadLocal变量 private static InheritableThreadLocal<String> threadLocal = new InheritableThreadLocal<>(); public static void main(String[] args) { // 在主线程中设置InheritableThreadLocal的值 threadLocal.set("Main Thread Value"); // 创建一个子线程 Thread childThread = new Thread(() -> { // 子线程可以访问到父线程设置的InheritableThreadLocal的值 System.out.println("Child Thread Value: " + threadLocal.get()); }); // 启动子线程 childThread.start(); try { childThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } // 主线程可以访问到自己设置的InheritableThreadLocal的值 System.out.println("Main Thread Value: " + threadLocal.get()); } }
在这个示例中,主线程设置了InheritableThreadLocal的值为"Main Thread Value",然后创建了一个子线程,在子线程中可以通过get方法获取到父线程设置的值。最后,主线程也可以通过get方法获取到自己设置的值。
TransmittableThreadLocal
👉 TransmittableThreadLocal
(TTL
):在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal
值的传递功能,解决异步执行时上下文传递的问题。一个Java
标准库本应为框架/中间件设施开发提供的标配能力,本库功能聚焦 & 0依赖,支持Java 6~21
。
JDK
的InheritableThreadLocal
类可以完成父线程到子线程的值传递。但对于使用线程池等会池化复用线程的执行组件的情况,线程由线程池创建好,并且线程是池化起来反复使用的;这时父子线程关系的ThreadLocal
值传递已经没有意义,应用需要的实际上是把 任务提交给线程池时的ThreadLocal
值传递到 任务执行时。
本库提供的TransmittableThreadLocal
类继承并加强InheritableThreadLocal
类,解决上述的问题,使用详见 User Guide。
https://github.com/alibaba/transmittable-thread-local