TransmittableThreadLocal需要配合TtlRunnable和TtlCallable使用。TtlRunnable和TtlCallable是TransmittableThreadLocal提供的两个包装类,它们分别用于包装Runnable和Callable任务,使得在任务执行时能够传递上下文;或者直接用TtlExecutors包装线程池使用;
但是经过我测试发现 就使用普通的线程池去赋值或获取TransmittableThreadLocal;打印结果也跟使用的一样啊;请问就使用普通的线程池的话影响在哪里呢;
public class TTLTest2 {
// 声明一个线程池
private static final ExecutorService pool = Executors.newFixedThreadPool(2);
// 声明一个TransmittableThreadLocal全局变量
private static final ThreadLocal<String> tl = new TransmittableThreadLocal<>();
public static void main(String[] args) {
// 设置一个值
tl.set("张三");
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
// 声明一个Runnable对象
Runnable r1 = () -> {
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
};
// 使用TtlRunnable包装一下Runnable对象
TtlRunnable ttlRunnable1 = TtlRunnable.get(r1);
// 向线程池提交
pool.submit(ttlRunnable1);
// 声明一个Callable对象
Callable<String> c1 = () -> {
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
return "success";
};
// 使用TtlCallable包装一下Callable对象
TtlCallable<String> ttlCallable1 = TtlCallable.get(c1);
// 向线程池提交
pool.submit(ttlCallable1);
tl.set("李四"); // 更新tl中的值
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
// 声明一个Runnable对象
Runnable r2 = () -> {
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
};
// 使用TtlRunnable包装一下Runnable对象
TtlRunnable ttlRunnable2 = TtlRunnable.get(r2);
// 向线程池提交
pool.submit(ttlRunnable2);
// 声明一个Callable对象
Callable<String> c2 = () -> {
System.out.println(Thread.currentThread().getName() + "--->" + tl.get());
return "success";
};
// 使用TtlCallable包装一下Callable对象
TtlCallable<String> ttlCallable2 = TtlCallable.get(c2);
// 向线程池提交
pool.submit(ttlCallable2);
// 关闭线程池
pool.shutdown();
}
}
运行结果:
main--->张三
pool-1-thread-1--->张三
pool-1-thread-2--->张三
main--->李四
pool-1-thread-1--->李四
pool-1-thread-2--->李四
将上面的 r1, c1, r2, c2不经过ttl的包装直接提交给线程池执行;结果也是一样的
那么他们差别在哪里??