主要解决了两个问题
1. thradlocal传入线程池
2. 线程池内的线程脏读 (读取了上一个threadlocal保存的值)
下方是测试代码
package org.dromara.web;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.alibaba.ttl.threadpool.TtlExecutors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class T {
public static void main(String[] args) {
// 创建一个普通的线程池
ExecutorService normalExecutor = Executors.newFixedThreadPool(1);
// 创建一个使用 TtlExecutors 包装过的线程池
ExecutorService ttlExecutor = TtlExecutors.getTtlExecutorService(normalExecutor);
// 使用普通的 ThreadLocal
ThreadLocal<String> threadLocal = new ThreadLocal<>();
threadLocal.set("Normal ThreadLocal");
// 使用 TransmittableThreadLocal
TransmittableThreadLocal<String> ttl = new TransmittableThreadLocal<>();
ttl.set("TransmittableThreadLocal");
// 提交任务到普通线程池 - 没有获得threadlocal
normalExecutor.submit(() -> {
System.out.println("Normal Executor: " + threadLocal.get()); // 通常输出 null
//设置脏数据
ttl.set("ceshi");
});
normalExecutor.submit(() -> {
//读到脏数据
System.out.println("Normal Executor: " + ttl.get()); // 通常输出 null
});
// 提交任务到 TTL 包装的线程池 - 可以获得线程的threadlocal
ttlExecutor.submit(() -> {
//没有读到脏数据
System.out.println("TTL Executor: " + ttl.get()); // 输出 "TransmittableThreadLocal"
});
// 清理并关闭线程池
threadLocal.remove();
ttl.remove();
normalExecutor.shutdown();
ttlExecutor.shutdown();
}
}