一、thread Local的介绍:
1、这个类提供线程局部变量。 这些变量与其正常的对应方式不同,因为访问一个的每个线程(通过其get或set方法)都有自己独立初始化的变量副本。 ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。
只要线程存活并且ThreadLocal实例可以访问,每个线程都保存对其线程局部变量副本的隐式引用; 线程消失后,线程本地实例的所有副本都将被垃圾收集(除非存在对这些副本的其他引用
2、api介绍:
2.1、构造方法:ThreadLocal();创建线程局部变量。
ThreadLocal<Integer> threadLocal = new ThreadLocal();
2.2、get()返回当前线程的此线程局部变量的副本中的值。
threadLocal.get()
2.3、initialValue()返回此线程局部变量的当前线程的“初始值”。
此方法是protect修饰,内部调用。 如果变量没有当前线程的值,则首先将其初始化为调用initialValue()方法返回的值。
2.4、remove()删除此线程局部变量的当前线程的值。
threadLocal.remove();
2.5、set(T value)将当前线程的此线程局部变量的副本设置为指定的值。
threadLocal.set(Object obj);
2.6、withInitial(Supplier<? extends S> supplier)创建线程局部变量。给此局部变量设置初始值
ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "");
3、简单应用:
public class ThreadLocalTest {
static ThreadLocal<Integer> threadLocal = new ThreadLocal();
public static void main(String[] args) throws ExecutionException, InterruptedException {
for (int i = 0; i < 3; i++) {
int finalI = i;
FutureTask<Integer> integerFutureTask = new FutureTask<>(() -> {
threadLocal.set(finalI);
return test();
});
Thread thread = new Thread(integerFutureTask);
thread.start();
System.out.println(thread.getId());
System.out.println(integerFutureTask.get());
}
}
public static Integer test() {
return threadLocal.get();
}
}