线程变量是存在于当前线程里的变量,在线程执行的某一时间放入线程变量,该变量会随着线程销毁而自行销毁。
应用场景可以是处理一条消息队列,也可以是处理一个http请求
下边来看实例
我在拦截器里放入这样一行代码,该请求在经过拦截器时,将用户信息存放到线程变量中
![](https://i-blog.csdnimg.cn/blog_migrate/ac32fd48788420edb5d8f4edbbee9dd3.png)
然后我在下边直接引用,那么我的createBy 字段就是登陆人的昵称,因为我在接收某个用户的请求时,已经将用户信息放入线程变量了,那么直到我这个请求结束之前,我从任何地方取出的,就是当前线程的登陆人。
![](https://i-blog.csdnimg.cn/blog_migrate/c48d83babd538684688ebc79004479c3.png)
下边附上源码
package com.example.pidog.threadLocal;
import com.example.pidog.domain.User;
public class UserThreadLocal {
/**
* 构造函数私有
*/
private UserThreadLocal() {
}
private static final ThreadLocal<User> USER_INFO_THREAD_LOCAL =
new ThreadLocal<>();
/**
* 清除用户信息
*/
public static void clear() {
USER_INFO_THREAD_LOCAL.remove();
}
/**
* 存储用户信息
*/
public static void set(User user) {
USER_INFO_THREAD_LOCAL.set(user);
}
/**
* 获取当前用户信息
*/
public static User getCurrentUser() {
return USER_INFO_THREAD_LOCAL.get();
}
public static Long getCurrentUserId(){
return USER_INFO_THREAD_LOCAL.get().getUserId();
}
}
调用的时候直接静态调用就可以了
UserThreadLocal.set(user)//在线程中存入用户
UserThreadLocal.getCurrentUser()//获取当前用户