一、前言
前面讲解了增强版的ThreadLocal-TransmittableThreadLocal可以优雅解决线程变量的继承问题,本节我们来探讨其实现。
二、TransmittableThreadLocal实现原理
简单回顾如何使用TransmittableThreadLocal解决线程变量继承问题:
// 0.创建线程池
private static final ThreadPoolExecutor bizPoolExecutor = new ThreadPoolExecutor(2, 2, 1, TimeUnit.MINUTES,
new LinkedBlockingQueue<>(1));
public static void main(String[] args) throws InterruptedException {
// 1 创建线程变量
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
// 2 投递三个任务
for (int i = 0; i < 3; ++i) {
bizPoolExecutor.execute(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
// 3休眠4s
Thread.sleep(4000);
// 4.设置线程变量
parent.set("value-set-in-parent");
// 5. 提交任务到线程池
Runnable task = () -> {
try {
// 5.1访问线程变量
System.out.println("parent:" + parent.get());
} catch (Exception e) {
e.printStackTrace();
}
};
// 5.2额外的处理,生成修饰了的对象ttlRunnable
Runnable ttlRunnable = TtlRunnable.get(task);
//5.3
bizPoolExecutor.execute(ttlRunnable);
}
介于Inheritab