自定义ThreadLocal继承InheritableThreadLocal并且实现childValue方法, 可以在子线程中也使用到主线程设置在ThreadLocal中的数据,如下所示:
/** * 使用自定义MyInheritableThreadLocal实现了InheritableThreadLocal重写了childValue的目的 * 父线程和子线程之间传递ThreadLocal中的变量值 */ private static final ThreadLocal<UserInfo> userInfo = new MyInheritableThreadLocal<>();
自定义类实现子线程使用主线程的ThreadLocal中的信息:
static class MyInheritableThreadLocal<T> extends InheritableThreadLocal<T> { @Override protected T childValue(T parentValue) { if (Objects.isNull(parentValue)) { return null; } // 子线程多次使用,只会调用一次,放心使用, 如此写的目的是为了线程和子线程之间传递变量 return (T) JacksonUtil.toJavaObj(JacksonUtil.toJsonStr(parentValue), parentValue.getClass()); } }
完