一般同步编程模型中我们使用ThreadLocal即可,但是在异步编程模型中(可能有同学有疑问,为什么不用InheritThreadLocal?看这篇记一次线上踩坑实录)会导致上下文失效。
但是spring 4.3给出了好的方案,利用TaskDecorator。
看这个名称大概就能猜出是一个装饰器设计原理
我们分析下线程池的源码
@Override
protected ExecutorService initializeExecutor(
ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) {
BlockingQueue<Runnable> queue = createQueue(this.queueCapacity);
ThreadPoolExecutor executor;
//当线程池的装饰器不为空时,执行execute方法会进入这里,因为它重写了execute方法
if (this.taskDecorator != null) {
executor = new ThreadPoolExecutor(
this.corePoolSize, this.maxPoolSize, this.keepAliveSeconds, TimeUnit.SECONDS,
queue, threadFactory, rejectedExecutionHandler) {
//这里是一个代理设计模式的实现,对execute做了一层代理
@Override
public void execute(Runnable command) {

同步编程模型用ThreadLocal,异步编程模型中使用InheritThreadLocal会导致上下文失效。Spring 4.3利用TaskDecorator给出解决方案,其基于装饰器设计原理。通过分析线程池源码和demo演示,表明该方案能正确获取传递的值,避免紊乱。
最低0.47元/天 解锁文章
260

被折叠的 条评论
为什么被折叠?



