本文主要是介绍TransmittableThreadLocal 测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
主要解决了两个问题
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);// 使用普通的 ThreadLocalThreadLocal<String> threadLocal = new ThreadLocal<>();threadLocal.set("Normal ThreadLocal");// 使用 TransmittableThreadLocalTransmittableThreadLocal<String> ttl = new TransmittableThreadLocal<>();ttl.set("TransmittableThreadLocal");// 提交任务到普通线程池 - 没有获得threadlocalnormalExecutor.submit(() -> {System.out.println("Normal Executor: " + threadLocal.get()); // 通常输出 null//设置脏数据ttl.set("ceshi");});normalExecutor.submit(() -> {//读到脏数据System.out.println("Normal Executor: " + ttl.get()); // 通常输出 null});// 提交任务到 TTL 包装的线程池 - 可以获得线程的threadlocalttlExecutor.submit(() -> {//没有读到脏数据System.out.println("TTL Executor: " + ttl.get()); // 输出 "TransmittableThreadLocal"});// 清理并关闭线程池threadLocal.remove();ttl.remove();normalExecutor.shutdown();ttlExecutor.shutdown();}
}
这篇关于TransmittableThreadLocal 测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!