线程变量ThreadLocal
2021-03-30 本文已影响0人
任未然
一. 概述
在多线程发开中, 有时候我们会需要用到一个针对当前线程的变量, 这时候
ThreadLocal
就派上用场了,ThreadLocal
可以给当前线程设一个唯一的标识, 也可以对当前线程设置或获取一个变量
二. 工具类
public class ThreadLocalUtil<T> {
private static ThreadLocal<String> threadLocalOnlyFlag = ThreadLocal.withInitial(() -> UUID.randomUUID().toString());
private static ThreadLocal tThreadLocal = new ThreadLocal();
/**
* 获取当前线程唯一标识
* @return
*/
public static String getThreadOnlyFlag(){
return threadLocalOnlyFlag.get();
}
/**
* 设置当前线程变量
* @param tClass
* @param <T>
* @return
*/
public static <T> T get(Class<T> tClass){
return (T)tThreadLocal.get();
}
/**
* 获取当前线程变量
* @param t
* @param <T>
*/
public static <T> void set(T t){
tThreadLocal.set(t);
}
/**
* 清除线程变量
*/
public static void clear() {
tThreadLocal.remove();
}
}
三. 测试
/**
* 测试
* @param args
*/
public static void main(String[] args) {
new Thread(() -> {
System.out.println("线程一:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
ThreadLocalUtil.set(new User().setUsername("username1"));
System.out.println("线程一:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
}).start();
new Thread(() -> {
System.out.println("线程二:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
ThreadLocalUtil.set(new User().setUsername("username2"));
System.out.println("线程二:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
}).start();
new Thread(() -> {
System.out.println("线程三:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
ThreadLocalUtil.set(new User().setUsername("username3"));
System.out.println("线程三:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
}).start();
new Thread(() -> {
System.out.println("线程四:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
ThreadLocalUtil.set(new User().setUsername("username4"));
System.out.println("线程四:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
}).start();
}
打印
线程二:唯一key=>556c92dd-09d6-4e74-9990-b9a207d6ac37
线程三:唯一key=>14a350ae-c614-45d8-92b1-067ee925cc19
线程四:唯一key=>4813472f-c5a5-4371-999f-10fc7c172ddd
线程一:唯一key=>1ff64a1f-0b24-4086-b61a-afaa41292940
线程三:变量=>username3
线程二:变量=>username2
线程四:变量=>username4
线程一:变量=>username1