ThreadLocal和InheritableThreadLocal的使用实例

关于ThreadLocal的作用,其实就是用于存储当前线程的变量,类似于map的存取。最近有一个场景用到,方便理解它的用途。

最近需要对系统中一些方法,记录这个方法的入参和出参,这里我们首先用到了spring的AOP,定义一个注解,日志表先自己生产一个主键

long id = System.currentTimeMillis();

使用

private final ThreadLocal<Long> local = new ThreadLocal<>();
local.set(id); //存储id

//todo        省略存储日志的逻辑

.......... 

什么时候去取这个local里的存储的线程变量id呢,我们方法入口记录了方法的入参,存储到数据库,方法里有些逻辑,比如调用其他的系统,同样也需要记录调用方法时的出入参,但是如何把这两个关连起来,表示这个时入口方法的子方法,就需要用的这个id, 作为子方法的parentId,这样做一个日志查询列表,就能查询所有主方法以及内部子方法的日志列表,同时也能关联起来。

//省略逻辑

..........

但是后面业务变更,在方法内,我需要启用一个异步任务去做一些逻辑,异常任务我们就直接新开一个线程,这里不赘述。但是问题是新开的线程,肯定获取不到原来线程里的线程变量,所以这里我们针对这种异步任务的,使用:

private final ThreadLocal<Long> local = new InheritableThreadLocal<>();

来代替,使得子线程可以共享主线程变量。其他逻辑不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值