内容简介:在Hystrix系列之前的文章中提到过,如果使用线程池模式,那么存在一个ThreadLocal变量跨线程传递的问题,即在主线程的ThreadLocal变量,无法在线程池中使用,不过Hystrix内部提供了解决方案,但是个人觉得这个方案不是那么友好。在Hystrix中,如果想在跨线程时共享数据,必须通过其实在用法上,和
在Hystrix系列之前的文章中提到过,如果使用线程池模式,那么存在一个ThreadLocal变量跨线程传递的问题,即在主线程的ThreadLocal变量,无法在线程池中使用,不过Hystrix内部提供了解决方案,但是个人觉得这个方案不是那么友好。
解决方案
在Hystrix中,如果想在跨线程时共享数据,必须通过 HystrixRequestVariableDefault
申明变量
HystrixRequestVariableDefault name = new HystrixRequestVariableDefault(); name.set("占小狼");
其实在用法上,和 ThreadLocal
是一样的,只是需要对现有代码的大量改造。
看下这个方案的实现原理,先从 set
开始。
public void set(T value) { HystrixRequestContext.getContextForCurrentThread().state.put(this, new LazyInitializer<T>(this, value)); }
Hystrix内部通过 HystrixRequestContext
实现数据的跨线程传递, getContextForCurrentThread
得到的是当前线程的 HystrixRequestContext
对象,每个 HystrixRequestContext
对象都有一个对应 ConcurrentHashMap
变量 state
,负责保存通过 HystrixRequestVariableDefault
初始化的数据。
通过 set
方法,该对象和数据会被保存在一个当前线程所属的map中。为了实现数据的跨线程传递,只需要在初始化task的时候,把主线程的 HystrixRequestContext
变量保存起来,在task执行的时候,重新赋值到子线程的上下文中,这样在子线程中就可以顺利拿到这些数据。
Hystrix中通过 HystrixContextCallable
包装原始 Callable
,并使用 parentThreadState
保存了当前线程的 HystrixRequestContext
变量。
任务执行时,先保存子线程现有的 HystrixRequestContext
变量,再赋值主线程的 HystrixRequestContext
变量,任务执行完成后,重新还原子线程。
如果不想使用Hystrix这种方式实现,也可以使用Hystrix提供的插件方式重新包装task,通过实现 HystrixConcurrencyStrategy
类,重写 wrapCallable
方法,和Hystrix的实现原理类似。
比如提供一个继承 ThreadLocal
的 XXXThreadLocal
类,那么业务方在使用时,就可以这样使用。
ThreadLocal name = new XXXThreadLocal(); name.set("占小狼");
这种方式看起来对已有逻辑只有一点小小的改动,对于新接入的也不那么陌生。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Transmittable-Thread-Local:阿里开源的线程间上下文传递解决方案
- C++ 值传递、指针传递、引用传递详解
- 简明笔记:指针传递和值传递
- golang中的函数参数值传递和引用传递
- 现代编程语言的值传递与引用传递
- 这一次,彻底解决Java的值传递和引用传递
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
新媒体文案创作与传播
秋叶、叶小鱼、勾俊伟 / 人民邮电出版社 / 2017-4 / 39.80元
《新媒体文案创作与传播》共分三篇。第1篇是新媒体文案基础篇,主要讲述了新媒体文案的基本概念、新媒体文案的岗位要求和职业能力素养;第二篇是新媒体文案创意实务篇,主要讲述了新媒体文案的创作思路、新媒体文案的写作技巧、爆款新媒体文案的打造、新媒体销售文案的写作、新媒体对文案传播的新要求、新媒体品-牌文案的写作,以及不同媒介的特征及发布形式;第三篇为新媒体文案相关技能补充,主要讲述的是策划能力。 《新媒体......一起来看看 《新媒体文案创作与传播》 这本书的介绍吧!